﻿///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Область ПрограммныйИнтерфейс

// Возвращает ссылку на вариант отчета.
//
// Параметры:
//  Отчет - СправочникСсылка.ИдентификаторыОбъектовРасширений
//        - СправочникСсылка.ИдентификаторыОбъектовМетаданных
//        - СправочникСсылка.ДополнительныеОтчетыИОбработки
//        - Строка - ссылка на отчет или полное имя внешнего отчета.
//  КлючВарианта - Строка - имя варианта отчета.
//
// Возвращаемое значение:
//  СправочникСсылка.ВариантыОтчетов, Неопределено - вариант отчета, 
//          либо Неопределено, если отчет отсутствует или недоступен по правам.
//
Функция ВариантОтчета(Отчет, КлючВарианта) Экспорт
	Результат = Неопределено;
	
	Запрос = Новый Запрос;
	Если ТипЗнч(Отчет) = Тип("СправочникСсылка.ИдентификаторыОбъектовРасширений") Тогда
		Запрос.Текст =
		"ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
		|	Отчеты.Ссылка КАК ВариантОтчета
		|ИЗ
		|	РегистрСведений.ПредопределенныеВариантыОтчетовВерсийРасширений КАК ОтчетыРасширений
		|	ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ВариантыОтчетов КАК Отчеты
		|		ПО Отчеты.ПредопределенныйВариант = ОтчетыРасширений.Вариант
		|ГДЕ
		|	ОтчетыРасширений.Отчет = &Отчет
		|	И ОтчетыРасширений.ВерсияРасширений = &ВерсияРасширений
		|	И ОтчетыРасширений.КлючВарианта = &КлючВарианта
		|
		|УПОРЯДОЧИТЬ ПО
		|	Отчеты.ПометкаУдаления";
		
		Запрос.УстановитьПараметр("ВерсияРасширений", ПараметрыСеанса.ВерсияРасширений);
	Иначе
		Запрос.Текст =
		"ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
		|	ВариантыОтчетов.Ссылка КАК ВариантОтчета
		|ИЗ
		|	Справочник.ВариантыОтчетов КАК ВариантыОтчетов
		|ГДЕ
		|	ВариантыОтчетов.Отчет = &Отчет
		|	И ВариантыОтчетов.КлючВарианта = &КлючВарианта
		|
		|УПОРЯДОЧИТЬ ПО
		|	ВариантыОтчетов.ПометкаУдаления";
	КонецЕсли;
	
	Запрос.УстановитьПараметр("Отчет", Отчет);
	Запрос.УстановитьПараметр("КлючВарианта", КлючВарианта);
	
	Выборка = Запрос.Выполнить().Выбрать();
	Если Выборка.Следующий() Тогда
		Результат = Выборка.ВариантОтчета;
	КонецЕсли;
	
	Возврат Результат;
КонецФункции

// Возвращает отчеты (СправочникСсылка.ВариантыОтчетов), доступные текущему пользователю.
// Их следует использовать во всех запросах к таблице
// справочника "ВариантыОтчетов" как отбор по реквизиту "Отчет",
// кроме случаев выборки вариантов из внешних отчетов.
//
// Возвращаемое значение:
//  Массив - отчеты, доступные текущему пользователю (СправочникСсылка.ИдентификаторыОбъектовРасширений, 
//           Строка, СправочникСсылка.ДополнительныеОтчетыИОбработки, 
//           СправочникСсылка.ИдентификаторыОбъектовМетаданных).
//           Тип элементов совпадает с типом реквизита Справочники.ВариантыОтчетов.Реквизиты.Отчет.
//
Функция ОтчетыТекущегоПользователя() Экспорт
	
	ДоступныеОтчеты = Новый Массив(ВариантыОтчетовПовтИсп.ДоступныеОтчеты());
	
	// Дополнительные отчеты, доступные текущему пользователю.
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда
		МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки");
		МодульДополнительныеОтчетыИОбработки.ПриДобавленииДополнительныхОтчетовДоступныхТекущемуПользователю(ДоступныеОтчеты);
	КонецЕсли;
	
	Возврат ДоступныеОтчеты;
	
КонецФункции

// Возвращает список вариантов отчета из хранилища настроек ХранилищеВариантовОтчетов. 
// См. также СтандартноеХранилищеНастроекМенеджер.ПолучитьСписок в синтакс-помощнике.
// В отличие от метода платформы, вместо права "АдминистрированиеДанных" проверяются права доступа к отчету.
//
// Параметры:
//  КлючОтчета - Строка - полное имя отчета с точкой.
//  Пользователь - Строка
//               - УникальныйИдентификатор
//               - ПользовательИнформационнойБазы
//               - Неопределено
//               - СправочникСсылка.Пользователи - имя, идентификатор или ссылка на пользователя, 
//                                                 настройки которого требуется получить.
//                                                 Если Неопределено, то текущий пользователь.
//
// Возвращаемое значение: 
//   СписокЗначений - список вариантов отчета, где:
//       * Значение - Строка - ключ варианта отчета.
//       * Представление - Строка - представление варианта отчета.
//
//
Функция КлючиВариантовОтчета(КлючОтчета, Знач Пользователь = Неопределено) Экспорт
	
	Возврат ХранилищаНастроек.ХранилищеВариантовОтчетов.ПолучитьСписок(КлючОтчета, Пользователь);
	
КонецФункции

// Удаляет варианты указанного отчета или всех отчетов.
// См. также СтандартноеХранилищеНастроекМенеджер.Удалить в синтакс-помощнике.
//
// Параметры:
//  КлючОтчета - Строка
//             - Неопределено - полное имя отчета с точкой.
//                              Если Неопределено, то удаляются настройки всех отчетов.
//  КлючВарианта - Строка
//               - Неопределено - ключ удаляемого варианта отчета.
//                                Если Неопределено, то удаляются все варианты отчета.
//  Пользователь - Строка
//               - УникальныйИдентификатор
//               - ПользовательИнформационнойБазы
//               - Неопределено
//               - СправочникСсылка.Пользователи - имя, идентификатор или ссылка на пользователя, 
//                                                 настройки которого удаляются.
//                                                 Если Неопределено, то удаляются настройки всех пользователей.
//
Процедура УдалитьВариантОтчета(КлючОтчета, КлючВарианта, Знач Пользователь) Экспорт
	
	ХранилищаНастроек.ХранилищеВариантовОтчетов.Удалить(КлючОтчета, КлючВарианта, Пользователь);
	
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// Поддержка переопределяемых модулей.

// Вызывает модуль менеджера отчета для заполнения его настроек.
// Для вызова из процедуры ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов.
//
// Параметры:
//  Настройки - см. ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов.Настройки.
//  ОтчетМетаданные - ОбъектМетаданных - метаданные отчета, в модуле менеджера которого расположена
//                                       экспортная процедура НастроитьВариантыОтчета(Настройки, НастройкиОтчета).
//
Процедура НастроитьОтчетВМодулеМенеджера(Настройки, ОтчетМетаданные) Экспорт
	НастройкиОтчета = ОписаниеОтчета(Настройки, ОтчетМетаданные);
	
	Попытка
		Отчеты[ОтчетМетаданные.Имя].НастроитьВариантыОтчета(Настройки, НастройкиОтчета);
	Исключение
		ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Недопустимое значение параметра %1 в процедуре %2.
			|Не удалось настроить варианты отчета из модуля менеджера по причине:
			|%3'"),
			"КлючВарианта", "ВариантыОтчетов.НастроитьОтчетВМодулеМенеджера",
			ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
		ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Ошибка, ТекстОшибки, ОтчетМетаданные);
	КонецПопытки;
КонецПроцедуры

// Возвращает настройки указанного отчета. Используется для настройки размещения и общих параметров отчета
//   в ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов.
//
// Параметры:
//  Настройки - см. ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов.Настройки.
//  Отчет     - ОбъектМетаданныхОтчет
//            - СправочникСсылка.ИдентификаторыОбъектовМетаданных - метаданные или ссылка отчета.
//
// Возвращаемое значение:
//   СтрокаДереваЗначений - настройки отчета и настройки "по умолчанию" для вариантов этого отчета, где:
//       * Включен              - Булево - если Ложь, то вариант отчета не выводится в панели отчетов.
//       * ВидимостьПоУмолчанию - Булево - если Ложь, то вариант отчета по умолчанию скрыт в панели отчетов.
//       * ПоказыватьВПодменюВариантов - Булево - если Ложь, то вариант отчета не отображается в подменю выбора вариантов  
//                                                отчета в форме отчета. Используется, когда Включен - Ложь.
//       * Размещение           - Соответствие из КлючИЗначение - настройки размещения варианта отчета в разделах, где:
//           ** Ключ     - ОбъектМетаданных - подсистема, в которой размещается отчет или вариант отчета.
//           ** Значение - Строка           - настройки размещения в подсистеме (группе), с вариантами значений:
//               ""        - вывод отчета в подсистеме без специального выделение.
//               "Важный"  - вывод отчета в подсистеме с выделением жирным шрифтом.
//               "СмТакже" - вывод отчета в группе "См. также".
//       * ФункциональныеОпции - Массив из Строка - имена функциональных опций варианта отчета.
//       * НастройкиДляПоиска  - Структура - дополнительные настройки для поиска этого варианта отчета, где:
//             ** НаименованияПолей - Строка - имена полей варианта отчета.
//             ** НаименованияПараметровИОтборов - Строка - имена настроек варианта отчета.
//             ** КлючевыеСлова - Строка - дополнительная терминология (в т.ч. специализированная или устаревшая).
//             ** ИменаМакетов  - Строка - используется вместо НаименованияПолей.
//       * ФорматНастроекСКД - Булево - отчет использует типовой формат хранения настроек на механике СКД,
//           а его основные формы поддерживают стандартную схему взаимодействия между формами (параметры и тип
//           возвращаемого значения).
//           Если Ложь, тогда для отчета отключаются проверки консистентности и некоторые механизмы, которые
//           рассчитывают на типовой формат.
//       * ОпределитьНастройкиФормы - Булево - отчет имеет программный интерфейс для тесной интеграции с формой отчета,
//           в том числе может переопределять некоторые настройки формы и подписываться на ее события.
//           Если Истина и отчет подключен к общей форме ФормаОтчета,
//           тогда в модуле объекта отчета следует определить процедуру по шаблону:
//               
//               // Задать настройки формы отчета.
//               //
//               // Параметры:
//               //   Форма - ФормаКлиентскогоПриложения, Неопределено
//               //   КлючВарианта - Строка, Неопределено
//               //   Настройки - см. ОтчетыКлиентСервер.НастройкиОтчетаПоУмолчанию
//               //
//               Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
//               	// Код процедуры.
//               КонецПроцедуры
//               
//       * Отчет - СправочникСсылка.ИдентификаторыОбъектовРасширений
//               - СправочникСсылка.ДополнительныеОтчетыИОбработки
//               - СправочникСсылка.ИдентификаторыОбъектовМетаданных
//               - Строка - полное имя или ссылка на отчет. 
//       * Метаданные - ОбъектМетаданныхОтчет - метаданные отчета.
//       * КлючВарианта - Строка - имя варианта отчета.
//       * ОписаниеПолучено - Булево - флажок что описание строки уже получено.
//           Описание получается методом ОписаниеВарианта().
//       * СистемнаяИнформация - Структура - другая служебная информация.
//     При этом колонки Отчет, Метаданные, КлючВарианта, ОписаниеПолучено, СистемнаяИнформация
//     являются служебными и предназначены только для чтения.
//
Функция ОписаниеОтчета(Настройки, Отчет) Экспорт
	Если ТипЗнч(Отчет) = Тип("ОбъектМетаданных") Тогда
		Результат = Настройки.НайтиСтроки(Новый Структура("Метаданные, ЭтоВариант", Отчет, Ложь));
	Иначе
		Результат = Настройки.НайтиСтроки(Новый Структура("Отчет, ЭтоВариант", Отчет, Ложь));
	КонецЕсли;
	
	Если Результат.Количество() = 0 Тогда
		Результат = НайденныеОписанияОтчета(Отчет);
	КонецЕсли;
	
	Если Результат.Количество() <> 1 Тогда
		ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Недопустимое значение параметра %1 в функции %2.
			|Отчет ""%3"" не подключен к подсистеме ""%4"". Проверьте свойство ""Хранилище вариантов"" в свойствах отчета.'"),
			"Отчет", "ВариантыОтчетов.ОписаниеОтчета", Строка(Отчет), НаименованиеПодсистемы(""));
	КонецЕсли;
	
	Возврат Результат[0];
КонецФункции

// Находит настройки варианта отчета. Используется для настройки размещения.
// Для использования в ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов.
//
// Параметры:
//  Настройки    - см. ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов.Настройки.
//  Отчет        - СтрокаДереваЗначений
//               - ОбъектМетаданных - описание настроек, метаданные или ссылка отчета.
//  КлючВарианта - Строка - имя варианта отчета как оно задано в схеме компоновки данных.
//
// Возвращаемое значение:
//   СтрокаДереваЗначений - настройки варианта отчета, где:
//       * Включен              - Булево - если Ложь, то вариант отчета не выводится в панели отчетов.
//       * ВидимостьПоУмолчанию - Булево - если Ложь, то вариант отчета по умолчанию скрыт в панели отчетов.
//       * ПоказыватьВПодменюВариантов - Булево - если Ложь, то вариант отчета не отображается в подменю выбора вариантов  
//                                                отчета в форме отчета. Используется, когда Включен - Ложь.
//       * Наименование         - Строка - наименование варианта отчета.
//       * Описание             - Строка - подсказка к варианту отчета.
//       * Размещение           - Соответствие из КлючИЗначение - настройки размещения варианта отчета в разделах, где:
//           ** Ключ     - ОбъектМетаданных - подсистема, в которой размещается отчет или вариант отчета.
//           ** Значение - Строка           - настройки размещения в подсистеме (группе), с вариантами значений:
//               ""        - вывод варианта в подсистеме без специального выделение.
//               "Важный"  - вывод варианта в подсистеме с выделением жирным шрифтом.
//               "СмТакже" - вывод варианта в группе "См. также".
//       * ФункциональныеОпции - Массив из Строка - имена функциональных опций варианта отчета.
//       * НастройкиДляПоиска  - Структура - дополнительные настройки для поиска этого варианта отчета, где:
//           ** НаименованияПолей              - Строка - имена полей варианта отчета.
//           ** НаименованияПараметровИОтборов - Строка - имена настроек варианта отчета.
//           ** КлючевыеСлова                  - Строка - дополнительная терминология (в т.ч. специализированная или устаревшая).
//           ** ИменаМакетов                   - Строка - используется вместо НаименованияПолей.
//       * ФорматНастроекСКД - Булево - отчет использует типовой формат хранения настроек на механике СКД,
//           а его основные формы поддерживают стандартную схему взаимодействия между формами (параметры и тип
//           возвращаемого значения).
//           Если Ложь, тогда для отчета отключаются проверки консистентности и некоторые механизмы, которые
//           рассчитывают на типовой формат.
//       * ОпределитьНастройкиФормы - Булево - отчет имеет программный интерфейс для тесной интеграции с формой отчета,
//           в том числе может переопределять некоторые настройки формы и подписываться на ее события.
//           Если Истина и отчет подключен к общей форме ФормаОтчета,
//           тогда в модуле объекта отчета следует определить процедуру по шаблону:
//               
//               // Задать настройки формы отчета.
//               //
//               // Параметры:
//               //   Форма - ФормаКлиентскогоПриложения, Неопределено
//               //   КлючВарианта - Строка, Неопределено
//               //   Настройки - см. значение ОтчетыКлиентСервер.НастройкиОтчетаПоУмолчанию
//               //
//               Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
//               	// Код процедуры.
//               КонецПроцедуры
//               
//       * Отчет - СправочникСсылка.ИдентификаторыОбъектовРасширений
//               - СправочникСсылка.ДополнительныеОтчетыИОбработки
//               - СправочникСсылка.ИдентификаторыОбъектовМетаданных
//               - Строка - полное имя или ссылка на отчет.
//       * Описание - Строка
//       * Метаданные - ОбъектМетаданныхОтчет - метаданные отчета.
//       * КлючВарианта - Строка - имя варианта отчета.
//       * Назначение - ПеречислениеСсылка.НазначенияВариантовОтчетов - назначение использования варианта отчета (по
//                                                                      умолчанию - ДляКомпьютеровИПланшетов)
//       * ОписаниеПолучено - Булево - флажок что описание строки уже получено.
//           Описание получается методом ОписаниеВарианта().
//       * СистемнаяИнформация - Структура - другая служебная информация.
//     При этом колонки Отчет, Метаданные, КлючВарианта, ОписаниеПолучено, СистемнаяИнформация
//     являются служебными и предназначены только для чтения.
//
Функция ОписаниеВарианта(Настройки, Отчет, КлючВарианта) Экспорт
	Если ТипЗнч(Отчет) = Тип("СтрокаТаблицыЗначений") Тогда
		ОписаниеОтчета = Отчет;
	Иначе
		ОписаниеОтчета = ОписаниеОтчета(Настройки, Отчет);
	КонецЕсли;
	
	Если Настройки.Найти(ОписаниеОтчета.Тип, "Тип") = Неопределено Тогда 
		Возврат ОписаниеОтчета;
	КонецЕсли;
	
	МетаданныеОтчета = ОписаниеОтчета.Метаданные; // ОбъектМетаданныхОтчет
	КлючВариантаОтчета = ?(ПустаяСтрока(КлючВарианта), ОписаниеОтчета.ОсновнойВариант, КлючВарианта);
	
	Поиск = Новый Структура("Отчет, КлючВарианта, ЭтоВариант", ОписаниеОтчета.Отчет, КлючВариантаОтчета, Истина);
	Результат = Настройки.НайтиСтроки(Поиск);
	
	Если Результат.Количество() <> 1 Тогда
		ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Недопустимое значение параметра %1 в функции %2:
				|вариант ""%3"" отсутствует в отчете ""%4"".'"),
			"КлючВарианта", "ВариантыОтчетов.ОписаниеВарианта", КлючВариантаОтчета, МетаданныеОтчета.Имя);
	КонецЕсли;
	
	ЗаполнитьОписаниеСтрокиВарианта(Результат[0], ОписаниеОтчета);
	
	Возврат Результат[0];
КонецФункции

// Устанавливает режим вывода Отчетов и Вариантов в панелях отчетов.
// Для вызова из процедуры ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов переопределяемого модуля
// и из процедуры НастроитьВариантыОтчета модуля объекта отчета.
//
// Параметры:
//  Настройки - см. ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов.Настройки.
//  ОтчетИлиПодсистема - СтрокаДереваЗначений
//                     - ОбъектМетаданныхОтчет
//                     - ОбъектМетаданныхПодсистема - описание отчета или
//                       подсистемы, для которой устанавливается режим вывода. Когда передана подсистема режим
//                       устанавливается рекурсивно для всех отчетов из ее состава.
//  ГруппироватьПоОтчетам - Булево
//                        - Строка - режим вывода гиперссылок этого отчета в панели отчетов:
//                          Если Истина, "ПоОтчетам" - варианты группируются по отчету.
//                          По умолчанию в панелях отчетов выводится только основной вариант отчета,
//                          а все прочие варианты этого отчета выводятся "под" основным и по умолчанию скрыты
//                          (но могут быть найдены поиском или включены при помощи флажков в режиме настройки).
//                          Основным вариантом считается первый предопределенный вариант в схеме отчета.
//                          Этот режим появился в версии 2.2.2 и позволяет уменьшить количество гиперссылок, выводимых в
//                          панелях отчетов. Если Ложь, "ПоВариантам" - все варианты отчета считаются самостоятельными,
//                          по умолчанию видны и выводятся независимо в панелях отчетов.
//                          Этот режим использовался в версии 2.2.1 и ранее.
//
Процедура УстановитьРежимВыводаВПанеляхОтчетов(Настройки, ОтчетИлиПодсистема, ГруппироватьПоОтчетам) Экспорт
	
	Если ТипЗнч(ГруппироватьПоОтчетам) <> Тип("Булево") Тогда
		ГруппироватьПоОтчетам = (ГруппироватьПоОтчетам = ВРег("ПоОтчетам"));
	КонецЕсли;
	
	Если ТипЗнч(ОтчетИлиПодсистема) = Тип("СтрокаТаблицыЗначений")
		Или Метаданные.Отчеты.Содержит(ОтчетИлиПодсистема) Тогда
		
		УстановитьРежимВыводаОтчетаВПанеляхОтчетов(Настройки, ОтчетИлиПодсистема, ГруппироватьПоОтчетам);
		Возврат;
	КонецЕсли;

	Подсистемы = Новый Массив;
	Подсистемы.Добавить(ОтчетИлиПодсистема);
	Количество = 1;
	ОбработанныеОбъекты = Новый Соответствие;
	Пока Количество > 0 Цикл
		Количество = Количество - 1;
		Подсистема = Подсистемы[0];
		Подсистемы.Удалить(0);
		Для Каждого ВложеннаяПодсистема Из Подсистема.Подсистемы Цикл
			Количество = Количество + 1;
			Подсистемы.Добавить(ВложеннаяПодсистема);
		КонецЦикла;
		Для Каждого ОбъектМетаданных Из ОтчетИлиПодсистема.Состав Цикл
			Если ОбработанныеОбъекты[ОбъектМетаданных] <> Неопределено Тогда
				Продолжить;
			КонецЕсли;
			
			ОбработанныеОбъекты[ОбъектМетаданных] = Истина;
			Если Метаданные.Отчеты.Содержит(ОбъектМетаданных) Тогда
				УстановитьРежимВыводаОтчетаВПанеляхОтчетов(Настройки, ОбъектМетаданных, ГруппироватьПоОтчетам);
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;

КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// Для вызова из отчетов.

// Обновляет состав справочника ПользовательскиеНастройкиОтчетов после сохранения новой настройки.
// Вызывается в одноименном обработчике формы отчета после выполнения кода формы.
//
// Параметры:
//  Форма - ФормаКлиентскогоПриложения - форма отчета.
//  Настройки - ПользовательскиеНастройкиКомпоновкиДанных - передается "как есть" из процедуры ПриСохраненииПользовательскихНастроекНаСервере.
//
Процедура ПриСохраненииПользовательскихНастроекНаСервере(Форма, Настройки) Экспорт
	
	РеквизитыФормы = Новый Структура("КлючОбъекта, ВариантСсылка");
	ЗаполнитьЗначенияСвойств(РеквизитыФормы, Форма);
	Если Не ЗначениеЗаполнено(РеквизитыФормы.КлючОбъекта)
		Или Не ЗначениеЗаполнено(РеквизитыФормы.ВариантСсылка) Тогда
		ОтчетОбъект = Форма.РеквизитФормыВЗначение("Отчет");
		ОтчетМетаданные = ОтчетОбъект.Метаданные();
		Если Не ЗначениеЗаполнено(РеквизитыФормы.КлючОбъекта) Тогда
			РеквизитыФормы.КлючОбъекта = ОтчетМетаданные.ПолноеИмя();
		КонецЕсли;
		Если Не ЗначениеЗаполнено(РеквизитыФормы.ВариантСсылка) Тогда
			ОтчетИнформация = ИнформацияОбОтчете(РеквизитыФормы.КлючОбъекта);
			Если НЕ ЗначениеЗаполнено(ОтчетИнформация.ТекстОшибки) Тогда
				ОтчетСсылка = ОтчетИнформация.Отчет;
			Иначе
				ОтчетСсылка = РеквизитыФормы.КлючОбъекта;
			КонецЕсли;
			РеквизитыФормы.ВариантСсылка = ВариантОтчета(ОтчетСсылка, Форма.КлючТекущегоВарианта);
		КонецЕсли;
	КонецЕсли;
	
	КлючНастроек = РеквизитыФормы.КлючОбъекта + "/" + Форма.КлючТекущегоВарианта;
	СписокНастроек = ХранилищеПользовательскихНастроекОтчетов.ПолучитьСписок(КлючНастроек);
	КоличествоНастроек = СписокНастроек.Количество();
	ПользовательСсылка = Пользователи.АвторизованныйПользователь();
	
	ПользовательскиеНастройки = ПользовательскиеНастройкиВариантаОтчета(РеквизитыФормы.ВариантСсылка, ПользовательСсылка);
	Если ПользовательскиеНастройки = Неопределено Тогда 
		Возврат;
	КонецЕсли;
	
	Для Каждого Настройка Из ПользовательскиеНастройки Цикл 
		ЭлементСписка = СписокНастроек.НайтиПоЗначению(Настройка.КлючПользовательскойНастройки);
		
		ПометкаУдаления = (ЭлементСписка = Неопределено);
		Если ПометкаУдаления <> Настройка.ПометкаУдаления Тогда
			НастройкаОбъект = Настройка.Ссылка.ПолучитьОбъект(); // СправочникОбъект.ПользовательскиеНастройкиОтчетов
			НастройкаОбъект.УстановитьПометкуУдаления(ПометкаУдаления);
		КонецЕсли;
		
		Если ПометкаУдаления Тогда
			Если КоличествоНастроек = 0 Тогда
				Прервать;
			Иначе
				Продолжить;
			КонецЕсли;
		КонецЕсли;
		
		Если Настройка.Наименование <> ЭлементСписка.Представление Тогда
			НастройкаОбъект = Настройка.Ссылка.ПолучитьОбъект(); // СправочникОбъект.ПользовательскиеНастройкиОтчетов
			НастройкаОбъект.Наименование = ЭлементСписка.Представление;
			
			// Блокировка не устанавливается, т.к. пользовательские настройки разрезаются по пользователям,
			// поэтому конкурентной работы не ожидается.
			НастройкаОбъект.Записать(); // АПК:1327
		КонецЕсли;
		
		СписокНастроек.Удалить(ЭлементСписка);
		КоличествоНастроек = КоличествоНастроек - 1;
	КонецЦикла;
	
	Для Каждого ЭлементСписка Из СписокНастроек Цикл
		НастройкаОбъект = Справочники.ПользовательскиеНастройкиОтчетов.СоздатьЭлемент();
		НастройкаОбъект.Наименование                  = ЭлементСписка.Представление;
		НастройкаОбъект.КлючПользовательскойНастройки = ЭлементСписка.Значение;
		НастройкаОбъект.Вариант                       = РеквизитыФормы.ВариантСсылка;
		НастройкаОбъект.Пользователь                  = ПользовательСсылка;
		
		// Блокировка не устанавливается, т.к. пользовательские настройки разрезаются по пользователям,
		// поэтому конкурентной работы не ожидается.
		НастройкаОбъект.Записать(); // АПК:1327
	КонецЦикла;
	
КонецПроцедуры

// Извлекает информацию о таблицах, используемых в схеме или запросе.
// Обработка исключений (например, в случае передачи некорректного текста запроса) выполняется вызывающим кодом.
//
// Параметры:
//  Объект - СхемаКомпоновкиДанных
//         - Строка - схема отчета или текст запроса.
//
// Возвращаемое значение:
//   Массив - имена таблиц, используемые в схеме или запросе.
//
// Пример:
//  // Вызов из собственной формы отчета, использующего СКД.
//  ИспользуемыеТаблицы = ВариантыОтчетов.ИспользуемыеТаблицы(РеквизитФормыВЗначение("Отчет").СхемаКомпоновкиДанных);
//  ВариантыОтчетов.ПроверитьИспользуемыеТаблицы(ИспользуемыеТаблицы);
//  // Вызов из обработчика ПриКомпоновкеРезультата отчета, использующего СКД.
//  ИспользуемыеТаблицы = ВариантыОтчетов.ИспользуемыеТаблицы(СхемаКомпоновкиДанных);
//  ВариантыОтчетов.ПроверитьИспользуемыеТаблицы(ИспользуемыеТаблицы);
//  // Вызов из обработчика ПриКомпоновкеРезультата отчета, использующего запрос.
//  ИспользуемыеТаблицы = ВариантыОтчетов.ИспользуемыеТаблицы(ТекстЗапроса);
//  ВариантыОтчетов.ПроверитьИспользуемыеТаблицы(ИспользуемыеТаблицы);
//
Функция ИспользуемыеТаблицы(Объект) Экспорт
	Таблицы = Новый Массив;
	
	Если ТипЗнч(Объект) = Тип("СхемаКомпоновкиДанных") Тогда
		ЗарегистрироватьТаблицыНаборовДанных(Таблицы, Объект.НаборыДанных);
	ИначеЕсли ТипЗнч(Объект) = Тип("Строка") Тогда
		ЗарегистрироватьТаблицыЗапроса(Таблицы, Объект);
	КонецЕсли;
	
	Возврат Таблицы;
КонецФункции

// Извлекает информацию о таблицах, используемых в схеме или запросе.
//
// Параметры:
//  Отчет - ОбъектМетаданныхОтчет
//        - ОтчетОбъект
//
// Возвращаемое значение:
//   Массив из см. ИспользуемыеТаблицы
//
Функция ИспользуемыеТаблицыОтчета(Отчет) Экспорт
	Если ТипЗнч(Отчет) = Тип("ОбъектМетаданных") Тогда 
		ОтчетОбъект = ОтчетыСервер.ОтчетОбъект(Отчет.ПолноеИмя());
		Идентификатор = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(Отчет);
	Иначе
		ОтчетОбъект = Отчет;
		Идентификатор = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(Отчет.Метаданные());
	КонецЕсли;
	
	ИспользуемыеТаблицы = ИспользуемыеТаблицы(ОтчетОбъект.СхемаКомпоновкиДанных);
	
	НастройкиОтчета = НастройкиОтчета(Идентификатор, Неопределено, ОтчетОбъект);
	Если НастройкиОтчета.События.ПриОпределенииИспользуемыхТаблиц Тогда
		ОтчетОбъект.ПриОпределенииИспользуемыхТаблиц(Неопределено, ИспользуемыеТаблицы);
	КонецЕсли;
	
	Возврат ИспользуемыеТаблицы;
КонецФункции

// Проверяет что таблицы, используемые в схеме или запросе, еще обновляются, и сообщает об этом пользователю.
// Проверка выполняется методом ОбновлениеИнформационнойБазы.ОбъектОбработан().
// Обработка исключений (например, в случае передачи некорректного текста запроса) выполняется вызывающим кодом.
//
// Параметры:
//  Объект - СхемаКомпоновкиДанных - схема отчета.
//         - Строка - текст запроса.
//         - Массив - имена таблиц, используемые отчетом:
//           * Строка - имя таблицы.
//  Сообщать - Булево - когда Истина и таблицы, используемые отчетом, еще не обновлены,
//             то будет выведено сообщение вида "Отчет может содержать некорректные данные".
//             Необязательный. По умолчанию Истина.
//
// Возвращаемое значение:
//   Булево - Истина когда в списке таблиц есть таблицы, которые еще не обновлены.
//
// Пример:
//  // Вызов из собственной формы отчета.
//  ВариантыОтчетов.ПроверитьИспользуемыеТаблицы(РеквизитФормыВЗначение("Отчет").СхемаКомпоновкиДанных);
//  // Вызов из обработчика ПриКомпоновкеРезультата отчета.
//  ВариантыОтчетов.ПроверитьИспользуемыеТаблицы(СхемаКомпоновкиДанных);
//  // Вызов при выполнении запроса.
//  ВариантыОтчетов.ПроверитьИспользуемыеТаблицы(ТекстЗапроса);
//
Функция ПроверитьИспользуемыеТаблицы(Объект, Сообщать = Истина) Экспорт
	Если ТипЗнч(Объект) = Тип("Массив") Тогда
		ИспользуемыеТаблицы = Объект;
	Иначе
		ИспользуемыеТаблицы = ИспользуемыеТаблицы(Объект);
	КонецЕсли;
	Для Каждого ПолноеИмя Из ИспользуемыеТаблицы Цикл
		Если Не ОбновлениеИнформационнойБазы.ОбъектОбработан(ПолноеИмя).Обработан Тогда
			Если Сообщать Тогда
				ОбщегоНазначения.СообщитьПользователю(СообщениеДанныеЕщеОбновляются());
			КонецЕсли;
			Возврат Истина;
		КонецЕсли;
	КонецЦикла;
	Возврат Ложь;
КонецФункции

////////////////////////////////////////////////////////////////////////////////
// Для вызова из обработчиков обновления прикладной конфигурации.

// Сбрасывает пользовательские настройки указанных отчетов.
//
// Параметры:
//  Ключ - ОбъектМетаданныхОтчет - метаданные отчета, для которого требуется сбросить настройки.
//       - СправочникСсылка.ВариантыОтчетов - вариант отчета, для которого требуется сбросить настройки.
//       - Строка - полное имя варианта отчета, для которого требуется сбросить настройки.
//                  Заполняется в формате "<ИмяОтчета>/<ИмяВарианта>".
//                  Если передать "*", то будут сброшены настройки всех отчетов конфигурации.
//  ТипыНастроек - Структура - типы пользовательских настроек, которые требуется сбросить.
//      Ключи структуры тоже являются необязательными. Значение по умолчанию указано в скобках:
//      * ЭлементОтбора - Булево - (Ложь) сбрасывать настройку "ЭлементОтбораКомпоновкиДанных".
//      * ЗначениеПараметраНастроек - Булево - (Ложь) сбрасывать настройку "ЗначениеПараметраНастроекКомпоновкиДанных".
//      * ВыбранныеПоля - Булево - (берется из ключа Прочие) сбрасывать настройку "ВыбранныеПоляКомпоновкиДанных".
//      * Порядок - Булево - (берется из ключа Прочие) сбрасывать настройку "ПорядокКомпоновкиДанных".
//      * ЭлементУсловногоОформления - Булево - (берется из ключа Прочие) сбрасывать настройку "ЭлементУсловногоОформленияКомпоновкиДанных".
//      * Прочие - Булево - (Истина) сбрасывать прочие настройки, не описанные в структуре явно.
//
Процедура СброситьПользовательскиеНастройки(Ключ, ТипыНастроек = Неопределено) Экспорт
	ОбщегоНазначенияКлиентСервер.ПроверитьПараметр(
		"ВариантыОтчетов.СброситьПользовательскиеНастройки",
		"Ключ",
		Ключ,
		Новый ОписаниеТипов("Строка, ОбъектМетаданных, СправочникСсылка.ВариантыОтчетов"));
	
	КлючиОбъектов = Новый Массив; // Итоговый список очищаемых ключей.
	
	// Список ключей может быть заполнен из запроса или извне можно передать один конкретный ключ.
	Запрос = Новый Запрос(
	"ВЫБРАТЬ
	|	&ИмяОтчета КАК ИмяОтчета,
	|	&ЭтоВнешнийОтчет КАК ЭтоВнешнийОтчет,
	|	ВариантыОтчетов.КлючВарианта
	|ИЗ
	|	Справочник.ВариантыОтчетов КАК ВариантыОтчетов
	|ГДЕ
	|	&Условие");
	
	ИмяОтчета = "ВЫБОР
	|		КОГДА ТИПЗНАЧЕНИЯ(ВариантыОтчетов.Отчет) = ТИП(Справочник.ИдентификаторыОбъектовМетаданных)
	|			ТОГДА ВЫРАЗИТЬ(ВариантыОтчетов.Отчет КАК Справочник.ИдентификаторыОбъектовМетаданных).Имя
	|		КОГДА ТИПЗНАЧЕНИЯ(ВариантыОтчетов.Отчет) = ТИП(Справочник.ИдентификаторыОбъектовРасширений)
	|			ТОГДА ВЫРАЗИТЬ(ВариантыОтчетов.Отчет КАК Справочник.ИдентификаторыОбъектовРасширений).Имя
	|		ИНАЧЕ ВЫРАЗИТЬ(ВариантыОтчетов.Отчет КАК СТРОКА(150))
	|	КОНЕЦ";
	
	ЭтоВнешнийОтчет = "Ложь";
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда 
		МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки");
		ИмяТаблицыДополнительныеОтчеты = МодульДополнительныеОтчетыИОбработки.ИмяТаблицыДополнительныеОтчеты();
		
		ИмяОтчета = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("ВЫБОР
			|		КОГДА ТИПЗНАЧЕНИЯ(ВариантыОтчетов.Отчет) = ТИП(Справочник.ИдентификаторыОбъектовМетаданных)
			|			ТОГДА ВЫРАЗИТЬ(ВариантыОтчетов.Отчет КАК Справочник.ИдентификаторыОбъектовМетаданных).Имя
			|		КОГДА ТИПЗНАЧЕНИЯ(ВариантыОтчетов.Отчет) = ТИП(Справочник.ИдентификаторыОбъектовРасширений)
			|			ТОГДА ВЫРАЗИТЬ(ВариантыОтчетов.Отчет КАК Справочник.ИдентификаторыОбъектовРасширений).Имя
			|		КОГДА ТИПЗНАЧЕНИЯ(ВариантыОтчетов.Отчет) = ТИП(%1)
			|			ТОГДА ВЫРАЗИТЬ(ВариантыОтчетов.Отчет КАК %1).ИмяОбъекта
			|		ИНАЧЕ ВЫРАЗИТЬ(ВариантыОтчетов.Отчет КАК СТРОКА(150))
			|	КОНЕЦ", ИмяТаблицыДополнительныеОтчеты);
			
		ЭтоВнешнийОтчет = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("ВЫБОР
			|		КОГДА ТИПЗНАЧЕНИЯ(ВариантыОтчетов.Отчет) = ТИП(%1)
			|			ТОГДА ИСТИНА
			|		ИНАЧЕ ЛОЖЬ
			|	КОНЕЦ", ИмяТаблицыДополнительныеОтчеты);
	
	КонецЕсли;
	
	Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ИмяОтчета", ИмяОтчета);
	Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ЭтоВнешнийОтчет", ЭтоВнешнийОтчет);
	
	Если Ключ = "*" Тогда
		Запрос.Текст = СтрЗаменить(Запрос.Текст, "&Условие", "ТипОтчета = ЗНАЧЕНИЕ(Перечисление.ТипыОтчетов.Внутренний)");
		
	ИначеЕсли ТипЗнч(Ключ) = Тип("ОбъектМетаданных") Тогда
		
		Запрос.Текст = СтрЗаменить(Запрос.Текст, "&Условие", "Отчет = &Отчет");
		Запрос.УстановитьПараметр("Отчет", ОбщегоНазначения.ИдентификаторОбъектаМетаданных(Ключ));
		
	ИначеЕсли ТипЗнч(Ключ) = Тип("СправочникСсылка.ВариантыОтчетов") Тогда
		
		Запрос.Текст = СтрЗаменить(Запрос.Текст, "&Условие", "Ссылка = &Ссылка");
		Запрос.УстановитьПараметр("Ссылка", Ключ);
		
	ИначеЕсли ТипЗнч(Ключ) = Тип("Строка") Тогда
		
		КлючОбъекта = "Отчет." + Ключ + "/ТекущиеПользовательскиеНастройки";
		КлючиОбъектов.Добавить(КлючОбъекта);
		
	Иначе
		ВызватьИсключение НСтр("ru = 'Некорректный тип параметра ""Отчет""'");
	КонецЕсли;
	
	Если Не ПустаяСтрока(Запрос.Текст) Тогда
		Выборка = Запрос.Выполнить().Выбрать();
		
		Пока Выборка.Следующий() Цикл
			ВидОтчета = ?(Выборка.ЭтоВнешнийОтчет, "ВнешнийОтчет.", "Отчет.");
			КлючОбъекта = ВидОтчета + Выборка.ИмяОтчета +"/"+ Выборка.КлючВарианта + "/ТекущиеПользовательскиеНастройки";
			КлючиОбъектов.Добавить(КлючОбъекта);
		КонецЦикла;
	КонецЕсли;
	
	Если ТипыНастроек = Неопределено Тогда
		ТипыНастроек = Новый Структура;
	КонецЕсли;
	
	ВариантыОтчетовКлиентСервер.ДополнитьСтруктуруКлючом(ТипыНастроек, "ЭлементОтбора", Истина);
	ВариантыОтчетовКлиентСервер.ДополнитьСтруктуруКлючом(ТипыНастроек, "ЗначениеПараметраНастроек", Истина);
	СбрасыватьПрочие = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ТипыНастроек, "Прочие", Истина);
	
	УстановитьПривилегированныйРежим(Истина);
	
	Для Каждого КлючОбъекта Из КлючиОбъектов Цикл
		ВыборкаХранилища = ХранилищеСистемныхНастроек.Выбрать(Новый Структура("КлючОбъекта", КлючОбъекта));
		
		ОшибокЧтенияПодряд = 0;
		Пока Истина Цикл
			Попытка
				ЭлементВыборкиПолучен = ВыборкаХранилища.Следующий();
				ОшибокЧтенияПодряд = 0;
			Исключение
				ЭлементВыборкиПолучен = Неопределено;
				ОшибокЧтенияПодряд = ОшибокЧтенияПодряд + 1;
				ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Ошибка, 
					НСтр("ru = 'Не удалось прочитать пользовательские настройки отчетов по причине:'")
					+ Символы.ПС
					+ ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
			КонецПопытки;
			
			Если ЭлементВыборкиПолучен = Ложь Тогда
				Прервать;
			ИначеЕсли ЭлементВыборкиПолучен = Неопределено Тогда
				Если ОшибокЧтенияПодряд > 100 Тогда
					Прервать;
				Иначе
					Продолжить;
				КонецЕсли;
			КонецЕсли;
			
			ПользовательскиеНастройкиКД = ВыборкаХранилища.Настройки; // ПользовательскиеНастройкиКомпоновкиДанных
			Если ТипЗнч(ПользовательскиеНастройкиКД) <> Тип("ПользовательскиеНастройкиКомпоновкиДанных") Тогда
				Продолжить;
			КонецЕсли;
			
			ЕстьИзменения = Ложь;
			Количество = ПользовательскиеНастройкиКД.Элементы.Количество();
			Для Номер = 1 По Количество Цикл
				ОбратныйИндекс = Количество - Номер;
				ПользовательскаяНастройкаКД = ПользовательскиеНастройкиКД.Элементы.Получить(ОбратныйИндекс);
				Тип = ОтчетыКлиентСервер.ТипНастройкиСтрокой(ТипЗнч(ПользовательскаяНастройкаКД));
				Сбрасывать = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ТипыНастроек, Тип, СбрасыватьПрочие);
				
				Если Сбрасывать Тогда
					ПользовательскиеНастройкиКД.Элементы.Удалить(ОбратныйИндекс);
					ЕстьИзменения = Истина;
				КонецЕсли;
			КонецЦикла;
			
			Если ЕстьИзменения Тогда
				ОбщегоНазначения.ХранилищеСистемныхНастроекСохранить(
					ВыборкаХранилища.КлючОбъекта,
					ВыборкаХранилища.КлючНастроек,
					ПользовательскиеНастройкиКД,
					,
					ВыборкаХранилища.Пользователь);
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;
КонецПроцедуры

// Переносит пользовательские варианты из стандартного хранилища вариантов в хранилище подсистемы.
// Используется при частичном внедрении - когда ХранилищеВариантовОтчетов установлено не для всей конфигурации,
// а в свойствах конкретных отчетов, подключенных к подсистеме.
// Рекомендуется использовать в обработчиках обновления на конкретную версию.
//
// Параметры:
//  ИменаОтчетов - Строка - имена отчетов, разделенные запятыми.
//                          Если параметр не указан, то переносятся все отчеты
//                          стандартного хранилища, после чего оно полностью очищается.
//
// Пример:
//  // Перенос всех пользовательских вариантов отчетов при обновлении.
//  ВариантыОтчетов.ПеренестиПользовательскиеИзСтандартногоХранилища();
//  // Перенос пользовательских вариантов отчетов, переведенных в хранилище подсистемы "Варианты отчетов".
//  ВариантыОтчетов.ПеренестиПользовательскиеИзСтандартногоХранилища("АнализЖурналаРегистрации, ЗадачиИстекающиеНаДату");
//
Процедура ПеренестиПользовательскиеИзСтандартногоХранилища(ИменаОтчетов = "") Экспорт
	ПредставлениеПроцедуры = НСтр("ru = 'Прямая конвертация вариантов отчетов'");
	ЗаписатьВЖурналЗапускПроцедуры(ПредставлениеПроцедуры);
	
	// Результат, который будет сохранен в хранилище.
	ТаблицаВариантов = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ПереносВариантовОтчетов", "ТаблицаВариантов", , , "");
	Если ТипЗнч(ТаблицаВариантов) <> Тип("ТаблицаЗначений") Или ТаблицаВариантов.Количество() = 0 Тогда
		ТаблицаВариантов = Новый ТаблицаЗначений;
		ТаблицаВариантов.Колонки.Добавить("Отчет",     ОписаниеТиповСтрока());
		ТаблицаВариантов.Колонки.Добавить("Вариант",   ОписаниеТиповСтрока());
		ТаблицаВариантов.Колонки.Добавить("Автор",     ОписаниеТиповСтрока());
		ТаблицаВариантов.Колонки.Добавить("Настройка", Новый ОписаниеТипов("ХранилищеЗначения"));
		ТаблицаВариантов.Колонки.Добавить("ПредставлениеОтчета",   ОписаниеТиповСтрока());
		ТаблицаВариантов.Колонки.Добавить("ПредставлениеВарианта", ОписаниеТиповСтрока());
		ТаблицаВариантов.Колонки.Добавить("ИдентификаторАвтора",   Новый ОписаниеТипов("УникальныйИдентификатор"));
	КонецЕсли;
	
	УдалятьВсе = (ИменаОтчетов = "" Или ИменаОтчетов = "*");
	МассивУдаляемыхКлючейОбъектов = Новый Массив;
	
	ВыборкаХранилища = ХранилищеВариантовОтчетов.Выбрать(НовыйФильтрПоКлючуОбъекта(ИменаОтчетов));
	ОшибокЧтенияПодряд = 0;
	Пока Истина Цикл
		Попытка
			ЭлементВыборкиПолучен = ВыборкаХранилища.Следующий();
			ОшибокЧтенияПодряд = 0;
		Исключение
			ЭлементВыборкиПолучен = Неопределено;
			ОшибокЧтенияПодряд = ОшибокЧтенияПодряд + 1;
			ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Ошибка,
				НСтр("ru = 'Не удалось прочитать варианты отчетов из стандартного хранилища по причине:'")
				+ Символы.ПС
				+ ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
		КонецПопытки;
		
		Если ЭлементВыборкиПолучен = Ложь Тогда
			Если ИменаОтчетов = "" Или ИменаОтчетов = "*" Тогда
				Прервать;
			Иначе
				ВыборкаХранилища = ХранилищеВариантовОтчетов.Выбрать(НовыйФильтрПоКлючуОбъекта(ИменаОтчетов));
				Продолжить;
			КонецЕсли;
		ИначеЕсли ЭлементВыборкиПолучен = Неопределено Тогда
			Если ОшибокЧтенияПодряд > 100 Тогда
				Прервать;
			Иначе
				Продолжить;
			КонецЕсли;
		КонецЕсли;
		
		// Пропуск не подключенных внутренних отчетов.
		ОтчетМетаданные = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ВыборкаХранилища.КлючОбъекта); // ОбъектМетаданныхОтчет 
		Если ОтчетМетаданные <> Неопределено Тогда
			ХранилищеМетаданные = ОтчетМетаданные.ХранилищеВариантов;
			Если ХранилищеМетаданные = Неопределено Или ХранилищеМетаданные.Имя <> "ХранилищеВариантовОтчетов" Тогда
				УдалятьВсе = Ложь;
				Продолжить;
			КонецЕсли;
		КонецЕсли;
		
		// Внешние варианты отчетов переносятся все, поскольку для них невозможно определить
		// подключены они к хранилищу подсистемы или нет.
		МассивУдаляемыхКлючейОбъектов.Добавить(ВыборкаХранилища.КлючОбъекта);
		
		ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоИмени(ВыборкаХранилища.Пользователь);
		Если ПользовательИБ = Неопределено Тогда
			Пользователь = Справочники.Пользователи.НайтиПоНаименованию(ВыборкаХранилища.Пользователь, Истина);
			Если Не ЗначениеЗаполнено(Пользователь) Тогда
				Продолжить;
			КонецЕсли;
			ИдентификаторПользователя = Пользователь.ИдентификаторПользователяИБ;
		Иначе
			ИдентификаторПользователя = ПользовательИБ.УникальныйИдентификатор;
		КонецЕсли;
		
		СтрокаТаблицы = ТаблицаВариантов.Добавить();
		СтрокаТаблицы.Отчет     = ВыборкаХранилища.КлючОбъекта;
		СтрокаТаблицы.Вариант   = ВыборкаХранилища.КлючНастроек;
		СтрокаТаблицы.Автор     = ВыборкаХранилища.Пользователь;
		СтрокаТаблицы.Настройка = Новый ХранилищеЗначения(ВыборкаХранилища.Настройки, Новый СжатиеДанных(9));
		СтрокаТаблицы.ПредставлениеВарианта = ВыборкаХранилища.Представление;
		СтрокаТаблицы.ИдентификаторАвтора   = ИдентификаторПользователя;
		Если ОтчетМетаданные = Неопределено Тогда
			СтрокаТаблицы.ПредставлениеОтчета = ВыборкаХранилища.КлючОбъекта;
		Иначе
			СтрокаТаблицы.ПредставлениеОтчета = ОтчетМетаданные.Представление();
		КонецЕсли;
	КонецЦикла;
	
	// Очистка стандартного хранилища.
	Если УдалятьВсе Тогда
		ХранилищеВариантовОтчетов.Удалить(Неопределено, Неопределено, Неопределено);
	Иначе
		Для Каждого КлючОбъекта Из МассивУдаляемыхКлючейОбъектов Цикл
			ХранилищеВариантовОтчетов.Удалить(КлючОбъекта, Неопределено, Неопределено);
		КонецЦикла;
	КонецЕсли;
	
	// Результат выполнения
	ЗаписатьВЖурналЗавершениеПроцедуры(ПредставлениеПроцедуры);
	
	// Загрузка вариантов в хранилище подсистемы.
	ЗагрузитьПользовательские(ТаблицаВариантов);
КонецПроцедуры

// Загружает в хранилище подсистемы варианты отчетов, предварительно сохраненные
// из системного хранилища вариантов в хранилище общих настроек.
// Используется для загрузки вариантов отчетов при полном или частичном внедрении.
// При полном внедрении может вызваться из обработки "ПереносВариантовОтчетов".
// Рекомендуется использовать в обработчиках обновления на конкретную версию.
//
// Параметры:
//  ПользовательскиеВарианты - ТаблицаЗначений
//                           - Неопределено - необязательный. Используется в служебных сценариях:
//       * Отчет - Строка - полное имя отчета в формате "Отчет.<ИмяОтчета>".
//       * Вариант - Строка - имя варианта отчета.
//       * Автор - Строка - имя пользователя.
//       * Настройка - ХранилищеЗначения - пользовательскиеНастройкиКомпоновкиДанных.
//       * ПредставлениеОтчета - Строка - представление отчета.
//       * ПредставлениеВарианта - Строка - представление варианта.
//       * ИдентификаторАвтора - УникальныйИдентификатор - идентификатор пользователя.
//
Процедура ЗагрузитьПользовательские(ПользовательскиеВарианты = Неопределено) Экспорт
	Если ПользовательскиеВарианты = Неопределено Тогда
		ПользовательскиеВарианты = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить(
			"ПереносВариантовОтчетов", "ПользовательскиеВарианты", , , "");
	КонецЕсли;
	
	Если ТипЗнч(ПользовательскиеВарианты) <> Тип("ТаблицаЗначений")
		Или ПользовательскиеВарианты.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;
	
	ПредставлениеПроцедуры = НСтр("ru = 'Завершить конвертацию вариантов отчетов'");
	ЗаписатьВЖурналЗапускПроцедуры(ПредставлениеПроцедуры);
	
	// Замена имен колонок под структуру справочника.
	Колонки = ПользовательскиеВарианты.Колонки; // КоллекцияКолонокТаблицыЗначений
	
	Колонки.Найти("Отчет").Имя = "ОтчетПолноеИмя";
	Колонки.Найти("Вариант").Имя = "КлючВарианта";
	Колонки.Найти("ПредставлениеВарианта").Имя = "Наименование";
	
	// Преобразование имен отчетов в ссылки справочника ИОМ.
	Колонки.Добавить("Отчет", Метаданные.Справочники.ВариантыОтчетов.Реквизиты.Отчет.Тип);
	Колонки.Добавить("Определен", Новый ОписаниеТипов("Булево"));
	Колонки.Добавить("ТипОтчета", Метаданные.Справочники.ВариантыОтчетов.Реквизиты.ТипОтчета.Тип);
	
	Для Каждого ОписаниеВарианта Из ПользовательскиеВарианты Цикл
		ИнформацияОбОтчете = ИнформацияОбОтчете(ОписаниеВарианта.ОтчетПолноеИмя);
		Если ЗначениеЗаполнено(ИнформацияОбОтчете.ТекстОшибки) Тогда
			ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Ошибка, ИнформацияОбОтчете.ТекстОшибки);
			Продолжить;
		КонецЕсли;
		
		ОписаниеВарианта.Определен = Истина;
		ОписаниеВарианта.Отчет = ИнформацияОбОтчете.Отчет;
		ОписаниеВарианта.ТипОтчета = ИнформацияОбОтчете.ТипОтчета;
	КонецЦикла;
	ПользовательскиеВарианты.Сортировать("ОтчетПолноеИмя Возр, КлючВарианта Возр");
	
	ПодсистемыОтчетов = РазмещениеОтчетовВПодсистемах();
	
	Запрос = Новый Запрос("
	|ВЫБРАТЬ
	|	ПользовательскиеВарианты.Наименование,
	|	ПользовательскиеВарианты.ПредставлениеОтчета,
	|	ПользовательскиеВарианты.Отчет,
	|	ПользовательскиеВарианты.ОтчетПолноеИмя,
	|	ПользовательскиеВарианты.ТипОтчета,
	|	ПользовательскиеВарианты.КлючВарианта,
	|	ПользовательскиеВарианты.Автор КАК ПредставлениеАвтора,
	|	ПользовательскиеВарианты.ИдентификаторАвтора,
	|	ПользовательскиеВарианты.Настройка КАК Настройки
	|ПОМЕСТИТЬ ПользовательскиеВарианты
	|ИЗ
	|	&ПользовательскиеВарианты КАК ПользовательскиеВарианты
	|ГДЕ
	|	ПользовательскиеВарианты.Определен
	|;
	|
	|ВЫБРАТЬ
	|	ПользовательскиеВарианты.Наименование,
	|	ПользовательскиеВарианты.ПредставлениеОтчета,
	|	ПользовательскиеВарианты.Отчет,
	|	ПользовательскиеВарианты.ОтчетПолноеИмя,
	|	ПользовательскиеВарианты.ТипОтчета,
	|	ПользовательскиеВарианты.КлючВарианта,
	|	ПользовательскиеВарианты.Настройки,
	|	Варианты.Ссылка,
	|	ПользовательскиеВарианты.ПредставлениеАвтора,
	|	Пользователи.Ссылка КАК Автор
	|ИЗ
	|	ПользовательскиеВарианты КАК ПользовательскиеВарианты
	|	ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВариантыОтчетов КАК Варианты
	|		ПО Варианты.Отчет = ПользовательскиеВарианты.Отчет
	|		И Варианты.КлючВарианта = ПользовательскиеВарианты.КлючВарианта
	|		И Варианты.ТипОтчета = ПользовательскиеВарианты.ТипОтчета
	|	ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Пользователи КАК Пользователи
	|		ПО Пользователи.ИдентификаторПользователяИБ = ПользовательскиеВарианты.ИдентификаторАвтора
	|		И НЕ Пользователи.ПометкаУдаления
	|");
	Запрос.УстановитьПараметр("ПользовательскиеВарианты", ПользовательскиеВарианты);
	
	ОписаниеВарианта = Запрос.Выполнить().Выбрать();
	Пока ОписаниеВарианта.Следующий() Цикл 
		Если ЗначениеЗаполнено(ОписаниеВарианта.Ссылка) Тогда
			Продолжить;
		КонецЕсли;
		
		ХранилищеВарианта = Справочники.ВариантыОтчетов.СоздатьЭлемент();
		ЗаполнитьЗначенияСвойств(ХранилищеВарианта, ОписаниеВарианта, "Наименование, Отчет, ТипОтчета, КлючВарианта, Автор");
		
		ХранилищеВарианта.Пользовательский = Истина;
		ХранилищеВарианта.ТолькоДляАвтора = Истина;
		
		Если ТипЗнч(ОписаниеВарианта.Настройки) = Тип("ХранилищеЗначения") Тогда
			ХранилищеВарианта.Настройки = ОписаниеВарианта.Настройки;
		Иначе
			ХранилищеВарианта.Настройки = Новый ХранилищеЗначения(ОписаниеВарианта.Настройки);
		КонецЕсли;
		
		// Поскольку переносятся пользовательские варианты отчетов,
		// то настройки размещения можно взять только из метаданных отчета.
		НайденныеПодсистемы = ПодсистемыОтчетов.НайтиСтроки(Новый Структура("ОтчетПолноеИмя", ОписаниеВарианта.ОтчетПолноеИмя));
		Для Каждого ОписаниеПодсистемы Из НайденныеПодсистемы Цикл
			Подсистема = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ОписаниеПодсистемы.ПодсистемаМетаданные);
			Если ТипЗнч(Подсистема) = Тип("Строка") Тогда
				Продолжить;
			КонецЕсли;
			Раздел = ХранилищеВарианта.Размещение.Добавить();
			Раздел.Использование = Истина;
			Раздел.Подсистема = Подсистема;
		КонецЦикла;
		
		// Варианты отчетов создаются, поэтому конкурентная работа с ними исключена.
		ХранилищеВарианта.Записать();
	КонецЦикла;
	
	ОбщегоНазначения.ХранилищеОбщихНастроекУдалить("ПереносВариантовОтчетов", "ТаблицаВариантов", "");
	
	ЗаписатьВЖурналЗавершениеПроцедуры(ПредставлениеПроцедуры);
КонецПроцедуры

#КонецОбласти

#Область СлужебныйПрограммныйИнтерфейс

// Получает объект отчета по ссылке на вариант отчета.
//
// Параметры:
//   Параметры - см. ПараметрыФормированияОтчета
//
// Возвращаемое значение:
//   Структура:
//       * СсылкаОтчета - Произвольный     - ссылка отчета.
//       * ПолноеИмя    - Строка           - полное имя отчета.
//       * Метаданные   - ОбъектМетаданных - метаданные отчета.
//       * Объект       - ОтчетОбъект
//                      - ВнешнийОтчет - объект отчета:
//           ** КомпоновщикНастроек - КомпоновщикНастроекКомпоновкиДанных - настройки отчета.
//           ** СхемаКомпоновкиДанных - СхемаКомпоновкиДанных - схема отчета.
//       * КлючВарианта - Строка           - имя предопределенного или идентификатор пользовательского варианта отчета.
//       * АдресСхемы   - Строка           - адрес временного хранилища, по которому размещена схема отчета.
//       * Успех        - Булево           - Истина, если удалось подключить отчет.
//       * ТекстОшибки  - Строка           - текст ошибки.
//
Функция ПодключитьОтчетИЗагрузитьНастройки(Знач Параметры) Экспорт
	
	ПараметрыФормированияОтчета = ПараметрыФормированияОтчета();
	ЗаполнитьЗначенияСвойств(ПараметрыФормированияОтчета, Параметры);
	Параметры = ПараметрыФормированияОтчета;
	
	Результат = Новый Структура("СсылкаВарианта, СсылкаОтчета, КлючВарианта, НастройкиФормы,
		|Объект, Метаданные, ПолноеИмя,
		|СхемаКД, АдресСхемы, СхемаМодифицирована, НастройкиКД, ПользовательскиеНастройкиКД,
		|ТекстОшибки, Успех");
	ЗаполнитьЗначенияСвойств(Результат, Параметры);
	Результат.Успех = Ложь;
	Результат.СхемаМодифицирована = Ложь;
	КлючПредопределенногоВарианта = "";
	
	// Поддержка возможности прямого выбора ссылок дополнительных отчетов в рассылках отчетов.
	Если ТипЗнч(Результат.НастройкиКД) <> Тип("НастройкиКомпоновкиДанных")
		И Результат.КлючВарианта = Неопределено
		И Результат.Объект = Неопределено
		И ТипЗнч(Результат.СсылкаВарианта) = ТипСсылкиДополнительногоОтчета() Тогда
		// Автоопределение ключа и ссылки варианта если передана только ссылка доп. отчета.
		Результат.СсылкаОтчета = Результат.СсылкаВарианта;
		Результат.СсылкаВарианта = Неопределено;
		ПодключениеОтчета = ПодключитьОтчетОбъект(Результат.СсылкаОтчета, Истина);
		Если Не ПодключениеОтчета.Успех Тогда
			Результат.ТекстОшибки = ПодключениеОтчета.ТекстОшибки;
			Возврат Результат;
		КонецЕсли;
		ЗаполнитьЗначенияСвойств(Результат, ПодключениеОтчета, "Объект, Метаданные, ПолноеИмя");
		ПодключениеОтчета.Очистить();
		Если Результат.Объект.СхемаКомпоновкиДанных = Неопределено Тогда
			Результат.Успех = Истина;
			Возврат Результат;
		КонецЕсли;
		ВариантНастроекКД = Результат.Объект.СхемаКомпоновкиДанных.ВариантыНастроек[0];
		Результат.КлючВарианта = ВариантНастроекКД.Имя;
		Результат.НастройкиКД  = ВариантНастроекКД.Настройки;
		Результат.СсылкаВарианта = ВариантОтчета(Результат.СсылкаОтчета, Результат.КлючВарианта);
		КлючПредопределенногоВарианта = Результат.КлючВарианта;
	КонецЕсли;
	
	НадоПрочитатьСсылкуОтчета = (Результат.Объект = Неопределено И Результат.СсылкаОтчета = Неопределено);
	НадоПрочитатьНастройки = (ТипЗнч(Результат.НастройкиКД) <> Тип("НастройкиКомпоновкиДанных"));
	Если НадоПрочитатьСсылкуОтчета Или НадоПрочитатьНастройки Тогда
		Если ТипЗнч(Результат.СсылкаВарианта) <> Тип("СправочникСсылка.ВариантыОтчетов")
			Или Не ЗначениеЗаполнено(Результат.СсылкаВарианта) Тогда
			Если Не НадоПрочитатьСсылкуОтчета И Результат.КлючВарианта <> Неопределено Тогда
				Результат.СсылкаВарианта = ВариантОтчета(Результат.СсылкаОтчета, Результат.КлючВарианта);
			КонецЕсли;
			Если Результат.СсылкаВарианта = Неопределено Тогда
				Результат.ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					НСтр("ru = 'При вызове процедуры ""%1"" не указаны значения параметров ""%2"".'"),
					"ВариантыОтчетов.ПодключитьОтчетИЗагрузитьНастройки",
					"СсылкаВарианта, СсылкаОтчета, КлючВарианта");
				Возврат Результат;
			КонецЕсли;
		КонецЕсли;
		ИменаСвойств = "КлючВарианта,Пользовательский,Родитель,Родитель.КлючВарианта" + ?(НадоПрочитатьСсылкуОтчета, ",Отчет", "")
			+ ?(НадоПрочитатьНастройки, ",Настройки", "");  // АПК:1297 Имена реквизитов, поэтому без НСтр.
		СвойстваВарианта = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Результат.СсылкаВарианта, ИменаСвойств);
		Результат.КлючВарианта = СвойстваВарианта.КлючВарианта;
		Если СвойстваВарианта.Пользовательский И ЗначениеЗаполнено(СвойстваВарианта.Родитель) Тогда
			Если ТипЗнч(СвойстваВарианта.РодительКлючВарианта) = Тип("Строка")
			   И ЗначениеЗаполнено(СвойстваВарианта.РодительКлючВарианта) Тогда
				КлючПредопределенногоВарианта = СвойстваВарианта.РодительКлючВарианта;
			КонецЕсли;
		Иначе
			КлючПредопределенногоВарианта = Результат.КлючВарианта;
		КонецЕсли;
		Если НадоПрочитатьСсылкуОтчета Тогда
			Результат.СсылкаОтчета = СвойстваВарианта.Отчет;
		КонецЕсли;
		Если НадоПрочитатьНастройки Тогда
			Результат.НастройкиКД = СвойстваВарианта.Настройки.Получить();
			НадоПрочитатьНастройки = (ТипЗнч(Результат.НастройкиКД) <> Тип("НастройкиКомпоновкиДанных"));
		КонецЕсли;
	КонецЕсли;
	
	Если Результат.Объект = Неопределено Тогда
		ПодключениеОтчета = ПодключитьОтчетОбъект(Результат.СсылкаОтчета, Истина);
		Если Не ПодключениеОтчета.Успех Тогда
			Результат.ТекстОшибки = ПодключениеОтчета.ТекстОшибки;
			Возврат Результат;
		КонецЕсли;
		ЗаполнитьЗначенияСвойств(Результат, ПодключениеОтчета, "Объект, Метаданные, ПолноеИмя");
		ПодключениеОтчета.Очистить();
		ПодключениеОтчета = Неопределено;
	ИначеЕсли Результат.ПолноеИмя = Неопределено Тогда
		Результат.Метаданные = Результат.Объект.Метаданные();
		Результат.ПолноеИмя = Результат.Метаданные.ПолноеИмя();
	КонецЕсли;
	
	ОтчетОбъект = Результат.Объект;
	КомпоновщикНастроекКД = ОтчетОбъект.КомпоновщикНастроек;
	
	Результат.НастройкиФормы = НастройкиФормыОтчета(Результат.СсылкаОтчета, Результат.КлючВарианта, ОтчетОбъект);
	
	Если ОтчетОбъект.СхемаКомпоновкиДанных = Неопределено Тогда
		Результат.Успех = Истина;
		Возврат Результат;
	КонецЕсли;
	
	// Чтение настроек.
	Если НадоПрочитатьНастройки Тогда
		ВариантыНастроекКД = ОтчетОбъект.СхемаКомпоновкиДанных.ВариантыНастроек;
		ВариантНастроекКД = ВариантыНастроекКД.Найти(КлючПредопределенногоВарианта);
		
		Если ВариантНастроекКД = Неопределено Тогда
			Результат.ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Вариант ""%1"" (ключ ""%2"") не существует в схеме отчета ""%3"".'"),
				Строка(Результат.СсылкаВарианта),
				Результат.КлючВарианта,
				Строка(Результат.СсылкаОтчета));
			Возврат Результат;
		КонецЕсли;
		
		Если ВариантыНастроекКД.Количество() = 1
			Или ВариантыНастроекКД.Индекс(ВариантНастроекКД) = 0 Тогда 
			
			Результат.НастройкиКД = КомпоновщикНастроекКД.Настройки;
		Иначе
			Результат.НастройкиКД = ВариантНастроекКД.Настройки;
		КонецЕсли;
	КонецЕсли;
	
	// Инициализация схемы.
	АдресСхемыЗаполнен = (ТипЗнч(Результат.АдресСхемы) = Тип("Строка") И ЭтоАдресВременногоХранилища(Результат.АдресСхемы));
	Если АдресСхемыЗаполнен И ТипЗнч(Результат.СхемаКД) <> Тип("СхемаКомпоновкиДанных") Тогда
		Результат.СхемаКД = ПолучитьИзВременногоХранилища(Результат.АдресСхемы);
	КонецЕсли;
	
	Результат.СхемаМодифицирована = (ТипЗнч(Результат.СхемаКД) = Тип("СхемаКомпоновкиДанных"));
	Если Результат.СхемаМодифицирована Тогда
		ОтчетОбъект.СхемаКомпоновкиДанных = Результат.СхемаКД;
	КонецЕсли;
	
	Если Не АдресСхемыЗаполнен И ТипЗнч(ОтчетОбъект.СхемаКомпоновкиДанных) = Тип("СхемаКомпоновкиДанных") Тогда
		ИдентификаторФормы = Параметры.ИдентификаторФормы;
		Если ТипЗнч(ИдентификаторФормы) = Тип("УникальныйИдентификатор") Тогда
			АдресСхемыЗаполнен = Истина;
			Результат.АдресСхемы = ПоместитьВоВременноеХранилище(ОтчетОбъект.СхемаКомпоновкиДанных, ИдентификаторФормы);
		ИначеЕсли Результат.СхемаМодифицирована Тогда
			АдресСхемыЗаполнен = Истина;
			Результат.АдресСхемы = ПоместитьВоВременноеХранилище(ОтчетОбъект.СхемаКомпоновкиДанных);
		КонецЕсли;
	КонецЕсли;
	
	Если АдресСхемыЗаполнен Тогда
		КомпоновщикНастроекКД.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(Результат.АдресСхемы));
	КонецЕсли;
	
	ОтчетыСервер.ЗаполнитьДополнительныеСвойства(ОтчетОбъект,
		Результат.НастройкиКД,
		Результат.КлючВарианта,
		КлючПредопределенногоВарианта);
	
	Если Результат.НастройкиФормы.События.ПередЗагрузкойНастроекВКомпоновщик Тогда
		ОтчетОбъект.ПередЗагрузкойНастроекВКомпоновщик(
			Результат,
			Параметры.КлючСхемы,
			Результат.КлючВарианта,
			Результат.НастройкиКД,
			Результат.ПользовательскиеНастройкиКД);
	КонецЕсли;
	
	ФиксированныеНастройкиКД = Параметры.ФиксированныеНастройкиКД;
	Если ТипЗнч(ФиксированныеНастройкиКД) = Тип("НастройкиКомпоновкиДанных")
		И КомпоновщикНастроекКД.ФиксированныеНастройки <> ФиксированныеНастройкиКД Тогда
		КомпоновщикНастроекКД.ЗагрузитьФиксированныеНастройки(ФиксированныеНастройкиКД);
	КонецЕсли;
	
	ОтчетыКлиентСервер.ЗагрузитьНастройки(КомпоновщикНастроекКД, Результат.НастройкиКД, Результат.ПользовательскиеНастройкиКД);
	
	Если Результат.НастройкиФормы.События.ПослеЗагрузкиНастроекВКомпоновщик Тогда
		ОтчетОбъект.ПослеЗагрузкиНастроекВКомпоновщик(Новый Структура);
	КонецЕсли;
	
	Результат.Успех = Истина;
	Возврат Результат;
КонецФункции

// Обновляет варианты дополнительного отчета при его записи.
//
// Параметры:
//  ТекущийОбъект - СправочникОбъект.ДополнительныеОтчетыИОбработки - объект хранилища дополнительного отчета. 
//  Отказ - Булево - признак отмены выполнения обработчика.
//  ВнешнийОбъект - ВнешнийОтчет - признак отмены выполнения обработчика.
//  
// Места использования:
//   Справочник.ДополнительныеОтчетыИОбработки.ПриЗаписиГлобальногоОтчета().
//
Процедура ПриЗаписиДополнительногоОтчета(ТекущийОбъект, Отказ, ВнешнийОбъект) Экспорт
	
	Если Не ВариантыОтчетовПовтИсп.ПравоДобавления() Тогда
		ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Недостаточно прав доступа для записи вариантов дополнительного отчета ""%1"".'"),
			ТекущийОбъект.Наименование);
		ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Ошибка, ТекстОшибки, ТекущийОбъект.Ссылка);
		ОбщегоНазначения.СообщитьПользователю(ТекстОшибки);
		Возврат;
	КонецЕсли;
	
	ПометкаУдаления = ТекущийОбъект.ПометкаУдаления;
	Если ВнешнийОбъект = Неопределено
		Или Не ТекущийОбъект.ИспользуетХранилищеВариантов
		Или Не ТекущийОбъект.ДополнительныеСвойства.ПубликацияИспользуется Тогда
		ПометкаУдаления = Истина;
	КонецЕсли;
	
	ПредопределенныеВарианты = Новый Соответствие;
	Если ПометкаУдаления = Ложь И ВнешнийОбъект <> Неопределено Тогда
		ОтчетМетаданные = ВнешнийОбъект.Метаданные(); 
		СхемаКДМетаданные = ОтчетМетаданные.ОсновнаяСхемаКомпоновкиДанных; // ОбъектМетаданныхМакет
		Если СхемаКДМетаданные <> Неопределено Тогда
			СхемаКД = ВнешнийОбъект.ПолучитьМакет(СхемаКДМетаданные.Имя);
			Для Каждого ВариантНастроекКД Из СхемаКД.ВариантыНастроек Цикл
				ПредопределенныеВарианты[ВариантНастроекКД.Имя] = ВариантНастроекКД.Представление;
			КонецЦикла;
		Иначе
			ПредопределенныеВарианты[""] = ОтчетМетаданные.Представление();
		КонецЕсли;
	КонецЕсли;
	
	// При снятии пометки удаления доп. отчета пометка удаления не снимается для пользовательских вариантов,
	// помеченных на удаление интерактивно.
	ТекстЗапроса =
	"ВЫБРАТЬ РАЗРЕШЕННЫЕ
	|	ВариантыОтчетов.Ссылка КАК Ссылка,
	|	ВариантыОтчетов.КлючВарианта КАК КлючВарианта,
	|	ВариантыОтчетов.Пользовательский КАК Пользовательский,
	|	ВариантыОтчетов.ПометкаУдаления КАК ПометкаУдаления
	|ИЗ
	|	Справочник.ВариантыОтчетов КАК ВариантыОтчетов
	|ГДЕ
	|	ВариантыОтчетов.Отчет = &Отчет
	|	И (&ПометкаУдаления
	|			ИЛИ НЕ ВариантыОтчетов.Пользовательский
	|			ИЛИ НЕ ВариантыОтчетов.ИнтерактивнаяПометкаУдаления)";
	
	Запрос = Новый Запрос(ТекстЗапроса);
	Запрос.УстановитьПараметр("Отчет", ТекущийОбъект.Ссылка);
	// При установке пометки удаления доп. отчета пометка удаления устанавливается для всех вариантов отчетов.
	Запрос.УстановитьПараметр("ПометкаУдаления", ПометкаУдаления = Истина);
	
	// Установка пометки удаления.
	ВариантыДополнительногоОтчета = Запрос.Выполнить().Выгрузить();
	
	Блокировка = Новый БлокировкаДанных;
	ЭлементБлокировки = Блокировка.Добавить(Метаданные.Справочники.ВариантыОтчетов.ПолноеИмя());
	ЭлементБлокировки.ИсточникДанных = ВариантыДополнительногоОтчета;
	ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Ссылка", "Ссылка");
	Блокировка.Заблокировать();
	
	Для каждого ВариантОтчета Из ВариантыДополнительногоОтчета Цикл
		
		ПометкаУдаленияВарианта = ПометкаУдаления;
		Представление = ПредопределенныеВарианты[ВариантОтчета.КлючВарианта];
		Если Не ПометкаУдаленияВарианта И Не ВариантОтчета.Пользовательский И Представление = Неопределено Тогда
			// Предопределенный вариант, который не существует в списке предопределенных для данного отчета.
			ПометкаУдаленияВарианта = Истина;
		КонецЕсли;
		
		Если ВариантОтчета.ПометкаУдаления <> ПометкаУдаленияВарианта Тогда
			ВариантОбъект = ВариантОтчета.Ссылка.ПолучитьОбъект();
			ВариантОбъект.ДополнительныеСвойства.Вставить("ЗаполнениеПредопределенных", Истина);
			Если ПометкаУдаленияВарианта Тогда
				ВариантОбъект.ДополнительныеСвойства.Вставить("ИндексироватьСхему", Ложь);
			Иначе
				ВариантОбъект.ДополнительныеСвойства.Вставить("ОтчетОбъект", ВнешнийОбъект);
			КонецЕсли;
			ВариантОбъект.УстановитьПометкуУдаления(ПометкаУдаленияВарианта);
		КонецЕсли;
		
		Если Представление <> Неопределено Тогда
			ПредопределенныеВарианты.Удалить(ВариантОтчета.КлючВарианта);
			
			ВариантОбъект = ВариантОтчета.Ссылка.ПолучитьОбъект();
			
			Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда
				МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер");
				МодульМультиязычностьСервер.ПриЧтенииПредставленийНаСервере(ВариантОбъект);
			КонецЕсли;
			
			ВариантОбъект.Наименование = Представление;
			ВариантОбъект.ДополнительныеСвойства.Вставить("ОтчетОбъект", ВнешнийОбъект);
			
			Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда
				МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер");
				МодульМультиязычностьСервер.ПередЗаписьюНаСервере(ВариантОбъект);
			КонецЕсли;
			
			ВариантОбъект.Записать();
		КонецЕсли;
	КонецЦикла;
	
	Если Не ПометкаУдаления Тогда
		// Зарегистрировать новые
		Для Каждого Представление Из ПредопределенныеВарианты Цикл
			ВариантОбъект = Справочники.ВариантыОтчетов.СоздатьЭлемент();
			ВариантОбъект.Отчет = ТекущийОбъект.Ссылка;
			ВариантОбъект.ТипОтчета = Перечисления.ТипыОтчетов.Дополнительный;
			ВариантОбъект.КлючВарианта = Представление.Ключ;
			ВариантОбъект.Наименование = Представление.Значение;
			ВариантОбъект.Пользовательский = Ложь;
			ТекущийОбъект.ДополнительныеСвойства.Свойство("НазначениеВариантаОтчета", ВариантОбъект.Назначение);
			ВариантОбъект.ДополнительныеСвойства.Вставить("ОтчетОбъект", ВнешнийОбъект);
			
			Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда
				МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер");
				МодульМультиязычностьСервер.ПередЗаписьюНаСервере(ВариантОбъект);
			КонецЕсли;
			
			ВариантОбъект.Записать();
		КонецЦикла;
	КонецЕсли;
	
КонецПроцедуры

// Получает варианты переданного отчета и их представления.
//
// Параметры:
//  ПолноеИмяОтчета - см. ОбъектМетаданныхОтчет.ПолноеИмя()
//  ПользовательИнформационнойБазы - Строка - имя пользователя информационной базы.
//  ТаблицаВариантовОтчетов - ТаблицаЗначений - таблица, в которую сохраняется информация о варианте отчета:
//       * КлючОбъекта - Строка - ключ отчета вида "Отчет.НазваниеОтчета".
//       * КлючВарианта - Строка - ключ варианта отчета.
//       * Представление - Строка - представление варианта отчета.
//       * СтандартнаяОбработка - Булево - если Истина - вариант отчета сохранен в стандартном хранилище.
//  СтандартнаяОбработка - Булево - если Истина - вариант отчета сохранен в стандартном хранилище.
//
Процедура ПользовательскиеВариантыОтчетов(ПолноеИмяОтчета, ПользовательИнформационнойБазы, ТаблицаВариантовОтчетов, СтандартнаяОбработка) Экспорт
	КлючОтчета = ПолноеИмяОтчета;
	ВсеВариантыОтчета = КлючиВариантовОтчета(КлючОтчета, ПользовательИнформационнойБазы);
	
	Для Каждого ВариантОтчета Из ВсеВариантыОтчета Цикл
		ЭлементСправочника = Справочники.ВариантыОтчетов.НайтиПоНаименованию(ВариантОтчета.Представление);
		Если ЭлементСправочника = Неопределено Тогда 
			Продолжить;
		КонецЕсли;
		
		СтандартнаяОбработка = Ложь;
		
		Если Не ЭлементСправочника.ТолькоДляАвтора Тогда 
			Продолжить;
		КонецЕсли;
		
		СтрокаВариантовОтчетов = ТаблицаВариантовОтчетов.Добавить();
		СтрокаВариантовОтчетов.КлючОбъекта = ПолноеИмяОтчета;
		СтрокаВариантовОтчетов.КлючВарианта = ВариантОтчета.Значение;
		СтрокаВариантовОтчетов.Представление = ВариантОтчета.Представление;
		СтрокаВариантовОтчетов.СтандартнаяОбработка = Ложь;
	КонецЦикла;
	
	Если Не СтандартнаяОбработка Тогда 
		Возврат;
	КонецЕсли;
	
	МетаданныеОтчета = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмяОтчета);
	Если (МетаданныеОтчета <> Неопределено И МетаданныеОтчета.ХранилищеВариантов <> Неопределено)
		Или ТипЗнч(ХранилищеВариантовОтчетов) <> Тип("СтандартноеХранилищеНастроекМенеджер") Тогда 
		
		СтандартнаяОбработка = Ложь;
	КонецЕсли;
КонецПроцедуры

// Удаляет переданный вариант отчета из хранилища вариантов отчетов.
//
Процедура УдалитьПользовательскийВариантОтчета(СведенияОВариантеОтчета, ПользовательИнформационнойБазы, СтандартнаяОбработка) Экспорт
	
	Если СведенияОВариантеОтчета.СтандартнаяОбработка Тогда
		Возврат;
	КонецЕсли;
	
	СтандартнаяОбработка = Ложь;
	УдалитьВариантОтчета(СведенияОВариантеОтчета.КлючОбъекта, СведенияОВариантеОтчета.КлючВарианта, ПользовательИнформационнойБазы);
	
КонецПроцедуры

// Формирует дополнительные параметры открытия формы отчета.
//
// Параметры:
//   ВариантСсылка - СправочникСсылка.ВариантыОтчетов - ссылка открываемого варианта отчета.
//
Функция ПараметрыОткрытия(ВариантСсылка) Экспорт
	ПараметрыОткрытия = Новый Структура("Ссылка, Отчет, ТипОтчета, ИмяОтчета, КлючВарианта, КлючЗамеров");
	Если ТипЗнч(ВариантСсылка) = ТипСсылкиДополнительногоОтчета() Тогда
		// Поддержка возможности прямого выбора ссылок дополнительных отчетов в рассылках отчетов.
		ПараметрыОткрытия.Отчет     = ВариантСсылка;
		ПараметрыОткрытия.ТипОтчета = "Дополнительный";
	Иначе
		ТекстЗапроса =
		"ВЫБРАТЬ РАЗРЕШЕННЫЕ
		|	ВариантыОтчетов.Отчет,
		|	ВариантыОтчетов.ТипОтчета,
		|	ВариантыОтчетов.КлючВарианта,
		|	ВариантыОтчетов.ПредопределенныйВариант.КлючЗамеров КАК КлючЗамеров
		|ИЗ
		|	Справочник.ВариантыОтчетов КАК ВариантыОтчетов
		|ГДЕ
		|	ВариантыОтчетов.Ссылка = &Ссылка";
		
		Запрос = Новый Запрос;
		Запрос.УстановитьПараметр("Ссылка", ВариантСсылка);
		Запрос.Текст = ТекстЗапроса;
		
		Выборка = Запрос.Выполнить().Выбрать();
		Если Не Выборка.Следующий() Тогда
			УстановитьПривилегированныйРежим(Истина);
			Выборка = Запрос.Выполнить().Выбрать();
			УстановитьПривилегированныйРежим(Ложь);
			Если Выборка.Следующий() Тогда
				ТекстОшибки = НСтр("ru = 'Недостаточно прав для просмотра.'");
			Иначе
				ТекстОшибки = НСтр("ru = 'Вариант отчета не существует.'");
			КонецЕсли;
			ВызватьИсключение ТекстОшибки;
		КонецЕсли;
		
		ЗаполнитьЗначенияСвойств(ПараметрыОткрытия, Выборка);
		ПараметрыОткрытия.Ссылка    = ВариантСсылка;
		ПараметрыОткрытия.ТипОтчета = ВариантыОтчетовКлиентСервер.ТипОтчетаСтрокой(Выборка.ТипОтчета, Выборка.Отчет);
	КонецЕсли;
	
	ПриПодключенииОтчета(ПараметрыОткрытия);
	
	Возврат ПараметрыОткрытия;
КонецФункции

// Подключение дополнительных отчетов.
Процедура ПриПодключенииОтчета(ПараметрыОткрытия) Экспорт
	
	ПараметрыОткрытия.Вставить("Подключен", Ложь);
	
	Если ПараметрыОткрытия.ТипОтчета = "Внутренний"
		Или ПараметрыОткрытия.ТипОтчета = "Расширение" Тогда
		
		МетаданныеОтчета = ОбщегоНазначения.ОбъектМетаданныхПоИдентификатору(
			ПараметрыОткрытия.Отчет, Ложь);
		
		Если ТипЗнч(МетаданныеОтчета) <> Тип("ОбъектМетаданных") Тогда
			ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Не удалось открыть отчет ""%1"".
					|Возможно, было отключено расширение конфигурации с этим отчетом.'"),
				ПараметрыОткрытия.Отчет);
		КонецЕсли;
		ПараметрыОткрытия.ИмяОтчета = МетаданныеОтчета.Имя;
		ПараметрыОткрытия.Подключен = Истина; // Отчеты конфигурации всегда подключены.
		
	ИначеЕсли ПараметрыОткрытия.ТипОтчета = "Расширение" Тогда
		Если Метаданные.Отчеты.Найти(ПараметрыОткрытия.ИмяОтчета) = Неопределено Тогда
			ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Не удалось открыть отчет ""%1"".
					|Возможно, было отключено расширение конфигурации с этим отчетом.'"),
				ПараметрыОткрытия.ИмяОтчета);
		КонецЕсли;
		ПараметрыОткрытия.Подключен = Истина;
	ИначеЕсли ПараметрыОткрытия.ТипОтчета = "Дополнительный" Тогда
		Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда
			МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки");
			МодульДополнительныеОтчетыИОбработки.ПриПодключенииОтчета(ПараметрыОткрытия);
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// Прочие процедуры служебного программного интерфейса.

Функция ПараметрыОбновленияНастроек() Экспорт
	
	Настройки = Новый Структура;
	Настройки.Вставить("Конфигурация", Истина);
	Настройки.Вставить("Расширения", Ложь);
	Настройки.Вставить("ОбщиеДанные", Истина);
	Настройки.Вставить("РазделенныеДанные", Истина);
	Настройки.Вставить("Оперативное", Истина);
	Настройки.Вставить("Отложенное", Ложь);
	Настройки.Вставить("ИндексироватьСхему", Ложь);
	Настройки.Вставить("ЗаполнятьПредставления", Истина);
	
	Если ОбщегоНазначения.РазделениеВключено() Тогда
		Если ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда
			Настройки.ОбщиеДанные = Ложь;
		Иначе // Неразделенный сеанс.
			Настройки.РазделенныеДанные = Ложь;
		КонецЕсли;
	ИначеЕсли ОбщегоНазначения.ЭтоАвтономноеРабочееМесто() Тогда // АРМ.
		Настройки.ОбщиеДанные = Ложь;
	КонецЕсли;
	
	Настройки.Расширения = Настройки.РазделенныеДанные;
	
	Возврат Настройки;
	
КонецФункции

// Актуализирует кэши метаданных подсистемы с учетом режима работы программы.
// Пример использования: после очистки хранилищ настроек.
//
// Параметры:
//   Настройки - Структура:
//     * Конфигурация - Булево - обновить неразделенный справочник ПредопределенныеВариантыОтчетов.
//     * Расширения   - Булево - обновить разделенный справочник ПредопределенныеВариантыОтчетовРасширений.
//     * ОбщиеДанные       - Булево - обновить неразделенный справочник ПредопределенныеВариантыОтчетов.
//     * РазделенныеДанные - Булево - обновить разделенный справочник ВариантыОтчетов.
//     * Оперативное - Булево - актуализировать список вариантов отчетов, их наименования и описания.
//     * Отложенное  - Булево - заполнить наименований полей, параметров, отборов и ключевых слов для поиска.
//     * ИндексироватьСхему - Булево - всегда индексировать схемы (не учитывать хеш-суммы).
//
Функция Обновить(Знач Настройки = Неопределено) Экспорт
	
	УстановитьОтключениеБезопасногоРежима(Истина);
	УстановитьПривилегированныйРежим(Истина);
	
	Если Настройки = Неопределено Тогда
		Настройки = ПараметрыОбновленияНастроек();
	КонецЕсли;
	
	Результат = Новый Структура;
	Результат.Вставить("ЕстьИзменения", Ложь);
	
	Если Настройки.Оперативное Тогда
		
		Если Настройки.ОбщиеДанные Тогда
			
			Если Настройки.Конфигурация Тогда
				ПромежуточныйРезультат = ОперативноеОбновлениеОбщихДанных("ОбщиеДанныеКонфигурации", Неопределено);
				Результат.Вставить("Оперативное_ОбщиеДанные_Конфигурация", ПромежуточныйРезультат);
				Если ПромежуточныйРезультат <> Неопределено И ПромежуточныйРезультат.ЕстьИзменения Тогда
					Результат.ЕстьИзменения = Истина;
				КонецЕсли;
			КонецЕсли;
			
			Если Настройки.Расширения Тогда
				ПромежуточныйРезультат = ОперативноеОбновлениеОбщихДанных("ОбщиеДанныеРасширений", Неопределено);
				Результат.Вставить("Оперативное_ОбщиеДанные_Расширения", ПромежуточныйРезультат);
				Если ПромежуточныйРезультат <> Неопределено И ПромежуточныйРезультат.ЕстьИзменения Тогда
					Результат.ЕстьИзменения = Истина;
				КонецЕсли;
			КонецЕсли;
			
		КонецЕсли;
		
		Если Настройки.РазделенныеДанные Тогда
			
			Если Настройки.Конфигурация Тогда
				ПромежуточныйРезультат = АктуализироватьВариантыОтчетов("РазделенныеДанныеКонфигурации");
				Результат.Вставить("Оперативное_РазделенныеДанные_Конфигурация", ПромежуточныйРезультат);
				Если ПромежуточныйРезультат <> Неопределено И ПромежуточныйРезультат.ЕстьИзменения Тогда
					Результат.ЕстьИзменения = Истина;
				КонецЕсли;
			КонецЕсли;
			
			Если Настройки.Расширения Тогда
				ПромежуточныйРезультат = АктуализироватьВариантыОтчетов("РазделенныеДанныеРасширений");
				Результат.Вставить("Оперативное_РазделенныеДанные_Расширения", ПромежуточныйРезультат);
				Если ПромежуточныйРезультат <> Неопределено И ПромежуточныйРезультат.ЕстьИзменения Тогда
					Результат.ЕстьИзменения = Истина;
				КонецЕсли;
			КонецЕсли;
			
		КонецЕсли;
		
	КонецЕсли;
	
	Если Настройки.Отложенное Тогда
		
		Если Настройки.ОбщиеДанные Тогда
			
			Если Настройки.Конфигурация Тогда
				ПромежуточныйРезультат = ОбновитьИндексПоиска("ОбщиеДанныеКонфигурации", Настройки.ИндексироватьСхему);
				Результат.Вставить("Отложенное_ОбщиеДанные_Конфигурация", ПромежуточныйРезультат);
				Если ПромежуточныйРезультат <> Неопределено И ПромежуточныйРезультат.ЕстьИзменения Тогда
					Результат.ЕстьИзменения = Истина;
				КонецЕсли;
			КонецЕсли;
			
			Если Настройки.Расширения Тогда
				ПромежуточныйРезультат = ОбновитьИндексПоиска("ОбщиеДанныеРасширений", Настройки.ИндексироватьСхему);
				Результат.Вставить("Отложенное_ОбщиеДанные_Расширения", ПромежуточныйРезультат);
				Если ПромежуточныйРезультат <> Неопределено И ПромежуточныйРезультат.ЕстьИзменения Тогда
					Результат.ЕстьИзменения = Истина;
				КонецЕсли;
			КонецЕсли;
			
		КонецЕсли;
		
		Если Настройки.РазделенныеДанные Тогда
			
			Если Настройки.Конфигурация Тогда
				ПромежуточныйРезультат = ОбновитьИндексПоиска("РазделенныеДанныеКонфигурации", Настройки.ИндексироватьСхему);
				Результат.Вставить("Отложенное_РазделенныеДанные_Конфигурация", ПромежуточныйРезультат);
				Если ПромежуточныйРезультат <> Неопределено И ПромежуточныйРезультат.ЕстьИзменения Тогда
					Результат.ЕстьИзменения = Истина;
				КонецЕсли;
			КонецЕсли;
			
			Если Настройки.Расширения Тогда
				ПромежуточныйРезультат = ОбновитьИндексПоиска("РазделенныеДанныеРасширений", Настройки.ИндексироватьСхему);
				Результат.Вставить("Отложенное_РазделенныеДанные_Расширения", ПромежуточныйРезультат);
				Если ПромежуточныйРезультат <> Неопределено И ПромежуточныйРезультат.ЕстьИзменения Тогда
					Результат.ЕстьИзменения = Истина;
				КонецЕсли;
			КонецЕсли;
			
		КонецЕсли;
		
	КонецЕсли;
	
	Если Настройки.ЗаполнятьПредставления Тогда 
		ЗапланироватьЗаполнениеПредставлений();
	КонецЕсли;
	
	Возврат Результат;
КонецФункции

Процедура СброситьЗаполнениеПредставлений(Знач Режим) Экспорт
	УстановитьПризнакЗаполненияПредставлений(Неопределено, Истина, Режим);
КонецПроцедуры

// Формирует отчет с указанными параметрами.
//
// Параметры:
//   Параметры - см. ПараметрыФормированияОтчета.
//   ПроверятьЗаполнение - Булево - если Истина, то перед формированием будет проведена проверка заполнения параметров отчета.
//   ПолучатьФлажокПустой - Булево - если Истина, то будет возвращен признак, сформирован ли отчет пустым.
//
// Возвращаемое значение:
//   Структура - результат формирования.
//
Функция СформироватьОтчет(Знач Параметры, Знач ПроверятьЗаполнение, Знач ПолучатьФлажокПустой) Экспорт
	Результат = Новый Структура("ТабличныйДокумент, Расшифровка,
		|СсылкаВарианта, СсылкаОтчета, КлючВарианта,
		|Объект, Метаданные, ПолноеИмя,
		|СхемаКД, АдресСхемы, СхемаМодифицирована, НастройкиФормы,
		|НастройкиКД, ВариантМодифицирован,
		|ПользовательскиеНастройкиКД, ПользовательскиеНастройкиМодифицированы,
		|ТекстОшибки, Успех, ДанныеЕщеОбновляются");
	
	Результат.Успех = Ложь;
	Результат.ТабличныйДокумент = Новый ТабличныйДокумент;
	Результат.ВариантМодифицирован = Ложь;
	Результат.ПользовательскиеНастройкиМодифицированы = Ложь;
	Результат.ДанныеЕщеОбновляются = Ложь;
	
	Если ПолучатьФлажокПустой Тогда
		Результат.Вставить("Пустой", Ложь);
	КонецЕсли;
	
	ПараметрыФормированияОтчета = ПараметрыФормированияОтчета();
	ЗаполнитьЗначенияСвойств(ПараметрыФормированияОтчета, Параметры);
	Параметры = ПараметрыФормированияОтчета;
	
	Подключение = ?(Параметры.Подключение <> Неопределено, Параметры.Подключение, 
		ПодключитьОтчетИЗагрузитьНастройки(Параметры));
	ЗаполнитьЗначенияСвойств(Результат, Подключение); // "Объект, Метаданные, ПолноеИмя, КлючВарианта, СхемаКД, АдресСхемы, СхемаМодифицирована, НастройкиФормы"
	
	Если Не Подключение.Успех Тогда
		Результат.ТекстОшибки = НСтр("ru = 'Не удалось сформировать отчет:'") + Символы.ПС + Подключение.ТекстОшибки;
		Возврат Результат;
	КонецЕсли;
	
	ОтчетОбъект = Результат.Объект;
	КомпоновщикНастроекКД = ОтчетОбъект.КомпоновщикНастроек;
	
	ЗаполнитьДвоичныеДанныеВнешнегоОтчета(ОтчетОбъект, Параметры);
	
	ДопСвойства = КомпоновщикНастроекКД.ПользовательскиеНастройки.ДополнительныеСвойства;
	ДопСвойства.Вставить("КлючВарианта", Результат.КлючВарианта);
	ДопСвойства.Вставить("ИспользуемыеТаблицы", Параметры.ИспользуемыеТаблицы);
	
	// Проверка корректности данных, по которым формируется отчет.
	
	Если ПроверятьЗаполнение Тогда
		ИсходныеСообщенияПользователю = ПолучитьСообщенияПользователю(Истина);
		ПроверкаПройдена = ОтчетОбъект.ПроверитьЗаполнение();
		СообщенияПользователю = ПолучитьСообщенияПользователю(Истина);
		
		Для Каждого Сообщение Из ИсходныеСообщенияПользователю Цикл
			Сообщение.Сообщить();
		КонецЦикла;
		
		Если Не ПроверкаПройдена Тогда
			Результат.ТекстОшибки = НСтр("ru = 'Отчет не прошел проверку заполнения:'");
			Для Каждого Сообщение Из СообщенияПользователю Цикл
				Результат.ТекстОшибки = Результат.ТекстОшибки + Символы.ПС + Сообщение.Текст;
			КонецЦикла;
			Возврат Результат;
		КонецЕсли;
	КонецЕсли;
	
	Попытка
		ИспользуемыеТаблицы = ИспользуемыеТаблицы(Результат.СхемаКД);
		ИспользуемыеТаблицы.Добавить(Результат.ПолноеИмя);
		
		Если Результат.НастройкиФормы.События.ПриОпределенииИспользуемыхТаблиц Тогда
			ОтчетОбъект.ПриОпределенииИспользуемыхТаблиц(Результат.КлючВарианта, ИспользуемыеТаблицы);
		КонецЕсли;
		
		Результат.ДанныеЕщеОбновляются = ПроверитьИспользуемыеТаблицы(ИспользуемыеТаблицы, Ложь);
	Исключение
		ТекстОшибки = НСтр("ru = 'Не удалось определить используемые таблицы:'");
		ТекстОшибки = ТекстОшибки + Символы.ПС + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Ошибка, ТекстОшибки, Результат.СсылкаВарианта);
	КонецПопытки;
	
	// Формирование и оценка скорости.
	ВыполнятьЗамеры = ВыполнятьЗамеры();
	Если ВыполнятьЗамеры Тогда
		ИмяКлючевойОперации = Параметры.ИмяКлючевойОперации;
		Если Не ЗначениеЗаполнено(ИмяКлючевойОперации) Тогда
			ИмяКлючевойОперации = ВариантыОтчетовСлужебный.КлючЗамеров(Результат.ПолноеИмя,
				 Результат.КлючВарианта) + ".Формирование";
		КонецЕсли;
		КомментарийКлючевойОперации = Параметры.КомментарийКлючевойОперации;
		Если Не ЗначениеЗаполнено(КомментарийКлючевойОперации)
		   И Результат.НастройкиКД <> Неопределено
		   И Результат.НастройкиКД.ДополнительныеСвойства.Свойство("КлючПредопределенногоВарианта") Тогда
			КомментарийКлючевойОперации = Новый Соответствие;
			КомментарийКлючевойОперации.Вставить("КлючПредопределенногоВарианта",
				Результат.НастройкиКД.ДополнительныеСвойства.КлючПредопределенногоВарианта);
		КонецЕсли;
		МодульОценкаПроизводительности = ОбщегоНазначения.ОбщийМодуль("ОценкаПроизводительности");
		ВремяНачала = МодульОценкаПроизводительности.НачатьЗамерВремени();
	КонецЕсли;
	
	Попытка
		ОтчетОбъект.СкомпоноватьРезультат(Результат.ТабличныйДокумент, Результат.Расшифровка);
	Исключение
		Результат.ТекстОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
		Результат.Успех = Ложь;
		
		ЗаписьЖурналаРегистрации(
			НСтр("ru = 'Варианты отчетов.Формирование отчета'", ОбщегоНазначения.КодОсновногоЯзыка()),
			УровеньЖурналаРегистрации.Ошибка,
			Результат.Метаданные,
			Результат.СсылкаВарианта,
			ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
		
		Возврат Результат;
	КонецПопытки;
	
	Если ВыполнятьЗамеры Тогда
		МодульОценкаПроизводительности.ЗакончитьЗамерВремениТехнологический(
			ИмяКлючевойОперации,
			ВремяНачала,
			1,
			КомментарийКлючевойОперации);
	КонецЕсли;
	
	// Регистрация результата.
	
	Если ДопСвойства <> КомпоновщикНастроекКД.ПользовательскиеНастройки.ДополнительныеСвойства Тогда
		НовыеДопСвойства = КомпоновщикНастроекКД.ПользовательскиеНастройки.ДополнительныеСвойства;
		ОбщегоНазначенияКлиентСервер.ДополнитьСтруктуру(НовыеДопСвойства, ДопСвойства, Ложь);
		ДопСвойства = НовыеДопСвойства;
	КонецЕсли;
	
	Модифицирован = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ДопСвойства, "ВариантМодифицирован");
	Если Модифицирован = Истина Тогда
		Результат.ВариантМодифицирован = Истина;
		Результат.НастройкиКД = КомпоновщикНастроекКД.Настройки;
	КонецЕсли;
	
	Модифицированы = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ДопСвойства, "ПользовательскиеНастройкиМодифицированы");
	Если Результат.ВариантМодифицирован Или Модифицированы = Истина Тогда
		Результат.ПользовательскиеНастройкиМодифицированы = Истина;
		Результат.ПользовательскиеНастройкиКД = КомпоновщикНастроекКД.ПользовательскиеНастройки;
	КонецЕсли;
	
	Если ПолучатьФлажокПустой Тогда
		Если ДопСвойства.Свойство("ОтчетПустой") Тогда
			Пустой = ДопСвойства.ОтчетПустой;
		ИначеЕсли Результат.ТабличныйДокумент.ВысотаТаблицы = 0
			И Результат.ТабличныйДокумент.ШиринаТаблицы = 0 Тогда 
			Пустой = Истина
		Иначе
			Пустой = ОтчетыСервер.ОтчетПустой(ОтчетОбъект);
		КонецЕсли;
		Результат.Вставить("Пустой", Пустой);
	КонецЕсли;
	
	НастройкиПечати = Результат.НастройкиФормы.Печать;
	НастройкиПечати.Вставить("КлючПараметровПечати", ОтчетыКлиентСервер.КлючУникальности(Результат.ПолноеИмя, 
		Результат.КлючВарианта));
	ЗаполнитьЗначенияСвойств(Результат.ТабличныйДокумент, НастройкиПечати);
	
	// Установка колонтитулов.
	
	НастройкиКолонтитулов = Неопределено;
	Если Результат.НастройкиКД <> Неопределено Тогда 
		Результат.НастройкиКД.ДополнительныеСвойства.Свойство("НастройкиКолонтитулов", НастройкиКолонтитулов);
	КонецЕсли;
	
	НазваниеОтчета = "";
	Если ЗначениеЗаполнено(Результат.СсылкаВарианта) Тогда 
		НазваниеОтчета = Строка(Результат.СсылкаВарианта);
	ИначеЕсли Результат.Метаданные <> Неопределено Тогда 
		НазваниеОтчета = Результат.Метаданные.Синоним;
	КонецЕсли;
	
	Если Не ОбщегоНазначения.РазделениеВключено()
		Или ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда 
		
		УправлениеКолонтитулами.УстановитьКолонтитулы(Результат.ТабличныйДокумент, НазваниеОтчета,, НастройкиКолонтитулов);
	КонецЕсли;
	
	Результат.Успех = Истина;
	
	// Чистка мусора.
	
	ДопСвойства.Удалить("ВариантМодифицирован");
	ДопСвойства.Удалить("ПользовательскиеНастройкиМодифицированы");
	ДопСвойства.Удалить("КлючВарианта");
	ДопСвойства.Удалить("ОтчетПустой");
	ДопСвойства.Удалить("ИспользуемыеТаблицы");
	
	Возврат Результат;
КонецФункции

// Возвращаемое значение:
//   Структура:
//     * СсылкаОтчета   - Произвольный
//     * СсылкаВарианта - СправочникСсылка.ВариантыОтчетов
//     * КлючВарианта   - Строка - имя предопределенного или идентификатор пользовательского варианта отчета.
//     * Объект         - ОтчетОбъект
//     * ПолноеИмя      - Строка
//     * КлючСхемы      - Строка
//     * АдресСхемы     - Строка
//     * ПараметрыИзменены - Булево
//     * СхемаМодифицирована - Булево
//     * НастройкиКД    - НастройкиКомпоновкиДанных
//     * СхемаКД        - СхемаКомпоновкиДанных
//     * ФиксированныеНастройкиКД - НастройкиКомпоновкиДанных
//     * ПользовательскиеНастройкиКД - ПользовательскиеНастройкиКомпоновкиДанных
//     * ИдентификаторФормы - УникальныйИдентификатор - идентификатор формы, из которой подключается отчет.
//     * ДвоичныеДанныеВнешнегоОтчета - Неопределено, ДвоичныеДанные - для выполнения в длительной операции.
//     * ИмяКлючевойОперации - Строка
//     * КомментарийКлючевойОперации - Строка, Соответствие
//     * ИспользуемыеТаблицы - Массив
//     * Подключение - см. ПодключитьОтчетИЗагрузитьНастройки
//
Функция ПараметрыФормированияОтчета() Экспорт
	
	Результат = Новый Структура;
	Результат.Вставить("СсылкаОтчета", Неопределено);
	Результат.Вставить("СсылкаВарианта", Неопределено);
	Результат.Вставить("КлючВарианта", Неопределено);

	Результат.Вставить("Объект", Неопределено);
	Результат.Вставить("ПолноеИмя", "");
	Результат.Вставить("КлючСхемы", "");
	Результат.Вставить("АдресСхемы", "");
	Результат.Вставить("ПараметрыИзменены", Ложь);
	Результат.Вставить("СхемаМодифицирована", Ложь);
	
	Результат.Вставить("НастройкиКД", Неопределено);
	Результат.Вставить("СхемаКД", Неопределено);
	Результат.Вставить("ФиксированныеНастройкиКД", Неопределено);
	Результат.Вставить("ПользовательскиеНастройкиКД", Неопределено);

	Результат.Вставить("ИдентификаторФормы", Неопределено);
	Результат.Вставить("ДвоичныеДанныеВнешнегоОтчета", Неопределено);
	Результат.Вставить("ИмяКлючевойОперации", "");
	Результат.Вставить("КомментарийКлючевойОперации", "");

	Результат.Вставить("ИспользуемыеТаблицы", Новый Массив);

	Результат.Вставить("Подключение", Неопределено);
	
	Возврат Результат;
	
КонецФункции
	
// Детализирует доступность отчетов по правам и функциональным опциям.
Функция ДоступностьОтчетов(СсылкиОтчетов) Экспорт

	Результат = Новый ТаблицаЗначений;
	Результат.Колонки.Добавить("Ссылка");
	Результат.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
	Результат.Колонки.Добавить("Отчет", Метаданные.Справочники.ВариантыОтчетов.Реквизиты.Отчет.Тип);
	Результат.Колонки.Добавить("ТипОтчетаСтрокой", Новый ОписаниеТипов("Строка"));
	Результат.Колонки.Добавить("Доступен", Новый ОписаниеТипов("Булево"));
	
	СсылкиВариантов = Новый Массив;
	СсылкиОтчетовКонфигурации = Новый Массив;
	СсылкиОтчетовРасширений = Новый Массив;
	СсылкиДопОтчетов = Новый Массив;
	
	Дубли = Новый Соответствие;
	
	УстановитьПривилегированныйРежим(Истина);
	Для Каждого Ссылка Из СсылкиОтчетов Цикл
		Если Дубли[Ссылка] <> Неопределено Тогда
			Продолжить;
		КонецЕсли;
		Дубли[Ссылка] = Истина;
		
		СтрокаТаблицы = Результат.Добавить();
		СтрокаТаблицы.Ссылка = Ссылка;
		СтрокаТаблицы.Представление = Строка(Ссылка);
		Тип = ТипЗнч(Ссылка);
		Если Тип = Тип("СправочникСсылка.ВариантыОтчетов") Тогда
			СсылкиВариантов.Добавить(Ссылка);
		Иначе
			СтрокаТаблицы.Отчет = Ссылка;
			СтрокаТаблицы.ТипОтчетаСтрокой = ВариантыОтчетовКлиентСервер.ТипОтчетаСтрокой(Тип, СтрокаТаблицы.Отчет);
			Если СтрокаТаблицы.ТипОтчетаСтрокой = "Внутренний" Тогда
				СсылкиОтчетовКонфигурации.Добавить(СтрокаТаблицы.Отчет);
			ИначеЕсли СтрокаТаблицы.ТипОтчетаСтрокой = "Расширение" Тогда
				СсылкиОтчетовРасширений.Добавить(СтрокаТаблицы.Отчет);
			ИначеЕсли СтрокаТаблицы.ТипОтчетаСтрокой = "Дополнительный" Тогда
				СсылкиДопОтчетов.Добавить(СтрокаТаблицы.Отчет);
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	УстановитьПривилегированныйРежим(Ложь);
	
	Если СсылкиВариантов.Количество() > 0 Тогда
		ЗначенияОтчетов = ОбщегоНазначения.ЗначениеРеквизитаОбъектов(СсылкиВариантов, "Отчет", Истина);
		Для Каждого Ссылка Из СсылкиВариантов Цикл
			СтрокаТаблицы = Результат.Найти(Ссылка, "Ссылка");
			ОтчетЗначение = ЗначенияОтчетов[Ссылка];
			Если ОтчетЗначение = Неопределено Тогда
				СтрокаТаблицы.Представление = НСтр("ru = 'Недостаточно прав для работы с вариантом отчета.'");
			Иначе
				СтрокаТаблицы.Отчет = ОтчетЗначение;
				СтрокаТаблицы.ТипОтчетаСтрокой = ВариантыОтчетовКлиентСервер.ТипОтчетаСтрокой(Неопределено, СтрокаТаблицы.Отчет);
				Если СтрокаТаблицы.ТипОтчетаСтрокой = "Внутренний" Тогда
					СсылкиОтчетовКонфигурации.Добавить(СтрокаТаблицы.Отчет);
				ИначеЕсли СтрокаТаблицы.ТипОтчетаСтрокой = "Расширение" Тогда
					СсылкиОтчетовРасширений.Добавить(СтрокаТаблицы.Отчет);
				ИначеЕсли СтрокаТаблицы.ТипОтчетаСтрокой = "Дополнительный" Тогда
					СсылкиДопОтчетов.Добавить(СтрокаТаблицы.Отчет);
				КонецЕсли;
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;
	
	СсылкиОтчетовКонфигурации = ОбщегоНазначенияКлиентСервер.СвернутьМассив(СсылкиОтчетовКонфигурации);
	СсылкиОтчетовРасширений = ОбщегоНазначенияКлиентСервер.СвернутьМассив(СсылкиОтчетовРасширений);
	СсылкиДопОтчетов = ОбщегоНазначенияКлиентСервер.СвернутьМассив(СсылкиДопОтчетов);
	
	Если СсылкиОтчетовКонфигурации.Количество() > 0 Тогда
		ПриОпределенииДоступностиОтчетов(СсылкиОтчетовКонфигурации, Результат);
	КонецЕсли;
	
	Если СсылкиОтчетовРасширений.Количество() > 0 Тогда
		ПриОпределенииДоступностиОтчетов(СсылкиОтчетовРасширений, Результат);
	КонецЕсли;
	
	Если СсылкиДопОтчетов.Количество() > 0 Тогда
		Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда
			МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки");
			МодульДополнительныеОтчетыИОбработки.ПриОпределенииДоступностиОтчетов(СсылкиДопОтчетов, Результат);
		КонецЕсли;
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

// Возвращает информацию об отчете, включающую ссылку и тип отчета, по полному имени отчета.
//
// Параметры:
//   ОтчетПолноеИмя - Строка - полное имя отчета в формате "Отчет.<ИмяОтчета>" или "ВнешнийОтчет.<ИмяОтчета>".
//   ВызыватьИсключение - Булево - если Истина, то вызвать исключение в случае ошибки. Возможные ошибки:
//                                 Недостаточно прав доступа к отчету;
//                                 Неизвестный тип отчета.
//
// Возвращаемое значение: 
//   Структура:
//       * Отчет          - СправочникСсылка.ИдентификаторыОбъектовРасширений
//                        - Строка
//                        - СправочникСсылка.ДополнительныеОтчетыИОбработки
//                        - СправочникСсылка.ИдентификаторыОбъектовМетаданных
//       * ТипОтчета      - ПеречислениеСсылка.ТипыОтчетов
//       * ОтчетИмя       - Строка - например, "ДинамикаИзмененийФайлов".
//       * ОтчетПолноеИмя - Строка - например, "Отчет.ДинамикаИзмененийФайлов".
//       * ОтчетМетаданные - ОбъектМетаданныхОтчет
//       * ТекстОшибки - Строка - текст ошибки.
//
Функция ИнформацияОбОтчете(Знач ОтчетПолноеИмя, Знач ВызыватьИсключение = Ложь) Экспорт
	Результат = Новый Структура("Отчет, ТипОтчета, ОтчетПолноеИмя, ОтчетИмя, ОтчетМетаданные, ТекстОшибки");
	Результат.Отчет          = ОтчетПолноеИмя;
	Результат.ОтчетПолноеИмя = ОтчетПолноеИмя;
	Результат.ТекстОшибки    = "";
	
	ПозицияТочки = СтрНайти(ОтчетПолноеИмя, ".");
	Если ПозицияТочки = 0 Тогда
		Префикс = "";
		Результат.ОтчетИмя = ОтчетПолноеИмя;
	Иначе
		Префикс = Лев(ОтчетПолноеИмя, ПозицияТочки - 1);
		Результат.ОтчетИмя = Сред(ОтчетПолноеИмя, ПозицияТочки + 1);
	КонецЕсли;
	
	Если ВРег(Префикс) = "ОТЧЕТ" Тогда
		Результат.ОтчетМетаданные = Метаданные.Отчеты.Найти(Результат.ОтчетИмя);
		Если Результат.ОтчетМетаданные = Неопределено Тогда
			Результат.ОтчетПолноеИмя = "ВнешнийОтчет." + Результат.ОтчетИмя;
			ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Предупреждение,
				СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					НСтр("ru = 'Отчет ""%1"" не существует в программе, он будет значиться как внешний.'"),
					ОтчетПолноеИмя));
		ИначеЕсли Не ПравоДоступа("Просмотр", Результат.ОтчетМетаданные) Тогда
			Результат.ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Недостаточно прав доступа к отчету ""%1"".'"),
				ОтчетПолноеИмя);
		КонецЕсли;
	ИначеЕсли ВРег(Префикс) = "ВНЕШНИЙОТЧЕТ" Тогда
		// Получение метаданных и проверок не требуется.
	Иначе
		Результат.ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Неизвестный тип отчета ""%1"" (ожидался ""%2"" или ""%3"").'"),
			"Отчет", "ВнешнийОтчет", ОтчетПолноеИмя);
		Если ВызыватьИсключение Тогда
			ВызватьИсключение Результат.ТекстОшибки;
		КонецЕсли;	
		Возврат Результат;
	КонецЕсли;
	
	Если Результат.ОтчетМетаданные = Неопределено Тогда
		
		Результат.Отчет = Результат.ОтчетПолноеИмя;
		Результат.ТипОтчета = Перечисления.ТипыОтчетов.Внешний;
		
		// Заменить тип и ссылку внешнего отчета для дополнительных отчетов, подключенных к хранилищу подсистемы.
		Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда
			
			Результат.Вставить("ПоУмолчаниюВсеПодключеныКХранилищу", ПоУмолчаниюВсеПодключеныКХранилищу());
			МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки");
			МодульДополнительныеОтчетыИОбработки.ПриОпределенииТипаИСсылкиЕслиОтчетДополнительный(Результат);
			Результат.Удалить("ПоУмолчаниюВсеПодключеныКХранилищу");
			
			Если ТипЗнч(Результат.Отчет) <> Тип("Строка") Тогда
				Результат.ТипОтчета = Перечисления.ТипыОтчетов.Дополнительный;
			КонецЕсли;
			
		КонецЕсли;
		
	Иначе
		Результат.Отчет = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(Результат.ОтчетМетаданные);
		Результат.ТипОтчета = ТипОтчета(Результат.Отчет);
	КонецЕсли;
	
	Если ВызыватьИсключение И ЗначениеЗаполнено(Результат.ТекстОшибки) Тогда
		ВызватьИсключение Результат.ТекстОшибки;
	КонецЕсли;	
	Возврат Результат;
	
КонецФункции

// Проверяет значение свойства отчета Хранилище вариантов.
//
// Параметры:
//   МетаданныеОтчета - ОбъектМетаданных - метаданные отчета, свойство которого проверяется.
//   ТекстПредупреждения - Строка - описание результата проверки.
//
// Возвращаемое значение: 
//   Булево:
//       * Истина - значение свойства отчета Хранилище вариантов равно ХранилищеВариантовОтчетов;
//       * Ложь - значение свойства не установлено или установлено, но ссылается
//                на Хранилище вариантов, не предусмотренное подсистемой.
//
Функция ХранилищеВариантовДополнительногоОтчетаКорректное(МетаданныеОтчета, ТекстПредупреждения = "") Экспорт 
	Если МетаданныеОтчета.ХранилищеВариантов = Метаданные.ХранилищаНастроек.ХранилищеВариантовОтчетов Тогда 
		Возврат Истина;
	КонецЕсли;
	
	Если МетаданныеОтчета.ХранилищеВариантов <> Неопределено Тогда 
		ТекстПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Свойство отчета ""Хранилище вариантов"" заполнено не корректно.
			|Должно быть установлено в значение %1.'"), Метаданные.ХранилищаНастроек.ХранилищеВариантовОтчетов.ПолноеИмя());
	Иначе
		ТекстПредупреждения = НСтр("ru = 'Свойство отчета ""Хранилище вариантов"" не заполнено.'");
	КонецЕсли;

	ТекстПредупреждения = ТекстПредупреждения + Символы.ПС + Символы.ПС
		+ НСтр("ru = 'Сохранение и выбор вариантов отчета будет работать с ограничениями.
		|Обратитесь к разработчику дополнительного (внешнего) отчета.'");
	ОбщегоНазначения.СообщитьПользователю(ТекстПредупреждения);
	
	Возврат Ложь;
КонецФункции

// Можно ли индексировать содержимое схемы отчета.
// 
// Возвращаемое значение:
//  Булево
//
Функция РазрешеноИндексированиеНеразделенныхДанных() Экспорт
	Возврат Не ОбщегоНазначения.РазделениеВключено();
КонецФункции

////////////////////////////////////////////////////////////////////////////////
// Для отчета по внедрению.

// Параметры:
//  ТипОтчетов - Строка
//  ПодключенныеКХранилищу - Булево
//
// Возвращаемое значение:
//   см. ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов.Настройки.
//
Функция ПредопределенныеВариантыОтчетов(ТипОтчетов = "Внутренний", ПодключенныеКХранилищу = Истина) Экспорт
	Результат = КоллекцияПредопределенныхВариантовОтчетов();
	
	ГруппироватьПоОтчетам = ГлобальныеНастройки().ВыводитьОтчетыВместоВариантов;
	РазрешеноИндексирование = РазрешеноИндексированиеНеразделенныхДанных();
	ЕстьПодключаемыеКоманды = ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПодключаемыеКоманды");
	Если ЕстьПодключаемыеКоманды Тогда
		СоставПодключаемыхОтчетовИОбработок = Метаданные.Подсистемы["ПодключаемыеОтчетыИОбработки"].Состав;
		МодульПодключаемыеКоманды = ОбщегоНазначения.ОбщийМодуль("ПодключаемыеКоманды");
	КонецЕсли;
	
	ДоступноИспользованиеРазделенныхДанных = ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных();
	ПодсистемыОтчетов = РазмещениеОтчетовВПодсистемах();
	КэшФлажкаХранилища = Неопределено;
	
	Для Каждого ОтчетМетаданные Из Метаданные.Отчеты Цикл 
		Если Не ДоступноИспользованиеРазделенныхДанных И ОтчетМетаданные.РасширениеКонфигурации() <> Неопределено Тогда
			Продолжить;
		КонецЕсли;
		
		Если ПодключенныеКХранилищу
			И Не ОтчетПодключенКХранилищу(ОтчетМетаданные, КэшФлажкаХранилища) Тогда
			Продолжить;
		КонецЕсли;
		
		ОтчетСсылка = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ОтчетМетаданные);
		ОтчетТип = ТипОтчетаСтрокой(ОтчетСсылка);
		Если ТипОтчетов <> Неопределено И ТипОтчетов <> ОтчетТип Тогда
			Продолжить;
		КонецЕсли;
		
		ОписаниеОтчета = ОписаниеОтчетаПоУмолчанию(Результат, ОтчетМетаданные, ОтчетСсылка, ОтчетТип, ГруппироватьПоОтчетам);
		
		// Размещение.
		Найденные = ПодсистемыОтчетов.НайтиСтроки(Новый Структура("ОтчетМетаданные", ОтчетМетаданные)); 
		Для Каждого СтрокаПодсистема Из Найденные Цикл
			ОписаниеОтчета.Размещение.Вставить(СтрокаПодсистема.ПодсистемаМетаданные, "");
		КонецЦикла;
		
		// Предопределенные варианты.
		Если ОписаниеОтчета.ИспользуетСКД Тогда
			ОтчетМенеджер = Отчеты[ОтчетМетаданные.Имя];
			СхемаКД = Неопределено;
			ВариантыНастроек = Неопределено;
			Попытка
				СхемаКД = ОтчетМенеджер.ПолучитьМакет(ОтчетМетаданные.ОсновнаяСхемаКомпоновкиДанных.Имя);
			Исключение
				ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					НСтр("ru = 'Не удалось прочитать схему отчета %1:
						|%2'"), ОтчетМетаданные.Имя, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
				ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Предупреждение, ТекстОшибки, ОтчетМетаданные);
			КонецПопытки;
			// Чтение настроек вариантов отчета из схемы.
			Если СхемаКД <> Неопределено Тогда
				Попытка
					ВариантыНастроек = СхемаКД.ВариантыНастроек;
				Исключение
					Если ОбщегоНазначения.РазделениеВключено() Тогда
						ШаблонТекстаОшибки = НСтр("ru = 'Не удалось прочитать список вариантов отчета %1 в неразделенном сеансе,
							|так как его настройки содержат ссылки на разделенные предопределенные значения.
							|См. подробнее на ИТС: https://its.1c.eu/bmk/bsp_reports_service_mode
							|%2'");
						
						ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
							ШаблонТекстаОшибки, ОтчетМетаданные.Имя, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
					Иначе
						ШаблонТекстаОшибки = НСтр("ru = 'Не удалось прочитать список вариантов отчета %1:
							|%2'");
						
						ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
							ШаблонТекстаОшибки, ОтчетМетаданные.Имя, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
					КонецЕсли;
					
					ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Предупреждение, ТекстОшибки, ОтчетМетаданные);
				КонецПопытки;
			КонецЕсли;
			// Чтение настроек вариантов отчета из модуля менеджера (если не получилось из схемы).
			Если ВариантыНастроек = Неопределено Тогда
				Попытка
					ВариантыНастроек = ОтчетМенеджер.ВариантыНастроек();
				Исключение
					ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
						НСтр("ru = 'Не удалось прочитать список вариантов отчета %1 из модуля менеджера:
							|%2'"), ОтчетМетаданные.Имя, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
					ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Ошибка, ТекстОшибки, ОтчетМетаданные);
				КонецПопытки;
			КонецЕсли;
			// Регистрация найденных вариантов.
			Если ВариантыНастроек <> Неопределено Тогда
				Для Каждого ВариантНастроекКД Из ВариантыНастроек Цикл
					ОписаниеВарианта = Результат.Добавить();
					ОписаниеВарианта.Отчет        = ОписаниеОтчета.Отчет;
					ОписаниеВарианта.КлючВарианта = ВариантНастроекКД.Имя;
					ОписаниеВарианта.Наименование = ВариантНастроекКД.Представление;
					Если ПустаяСтрока(ОписаниеВарианта.Наименование) Тогда // если конфигурация частично локализована
						ОписаниеВарианта.Наименование = ?(ОписаниеВарианта.КлючВарианта <> "Основной", ОписаниеВарианта.КлючВарианта,  // не локализуется
							ОписаниеОтчета.Наименование + "." + ОписаниеВарианта.КлючВарианта);
					КонецЕсли;	
					ОписаниеВарианта.Тип          = ОтчетТип;
					ОписаниеВарианта.ЭтоВариант   = Истина;
					Если ПустаяСтрока(ОписаниеОтчета.ОсновнойВариант) Тогда
						ОписаниеОтчета.ОсновнойВариант = ОписаниеВарианта.КлючВарианта;
					КонецЕсли;
					ОписаниеВарианта.Назначение = ОписаниеОтчета.Назначение;
					Если РазрешеноИндексирование И ТипЗнч(ВариантНастроекКД) = Тип("ВариантНастроекКомпоновкиДанных") Тогда
						Попытка
							ОписаниеВарианта.СистемнаяИнформация.Вставить("НастройкиКД", ВариантНастроекКД.Настройки);
						Исключение
							ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
								НСтр("ru = 'Не удалось прочитать настройки варианта ""%1"":
									|%2'"), ОписаниеВарианта.КлючВарианта, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
							ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Предупреждение, ТекстОшибки, ОтчетМетаданные);
						КонецПопытки;
					КонецЕсли;
				КонецЦикла;
			КонецЕсли;
		КонецЕсли;
		
		Если ПустаяСтрока(ОписаниеОтчета.ОсновнойВариант) Тогда
			ОписаниеВарианта = Результат.Добавить();
			ЗаполнитьЗначенияСвойств(ОписаниеВарианта, ОписаниеОтчета, "Отчет, Наименование, Назначение");
			ОписаниеВарианта.КлючВарианта = "";
			ОписаниеВарианта.ЭтоВариант   = Истина;
			ОписаниеОтчета.ОсновнойВариант = ОписаниеВарианта.КлючВарианта;
		КонецЕсли;
		
		// Обработка отчетов, включенных в состав подсистемы ПодключаемыеОтчетыИОбработки.
		Если ЕстьПодключаемыеКоманды И СоставПодключаемыхОтчетовИОбработок.Содержит(ОтчетМетаданные) Тогда
			НастройкиПоставщика = МодульПодключаемыеКоманды.НастройкиПодключаемогоОбъекта(ОтчетМетаданные.ПолноеИмя());
			Если НастройкиПоставщика <> Неопределено Тогда
				Если НастройкиПоставщика.ОпределитьНастройкиФормы Тогда
					ОписаниеОтчета.ОпределитьНастройкиФормы = Истина;
				КонецЕсли;
				Если НастройкиПоставщика.НастроитьВариантыОтчета Тогда
					НастроитьОтчетВМодулеМенеджера(Результат, ОтчетМетаданные);
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	
	КэшРезультата = Результат.Скопировать(, "Отчет, Наименование");
	
	// Механизмы расширения.
	Если ТипОтчетов = Неопределено Или ТипОтчетов = "Внутренний" Тогда
		НастроитьОтчетВМодулеМенеджера(Результат, Метаданные.Отчеты.УниверсальныйОтчет);
	КонецЕсли;
	
	Если ТипОтчетов = Неопределено
		Или ТипОтчетов = "Внутренний"
		Или ТипОтчетов = "Расширение" Тогда
		
		ИнтеграцияПодсистемБСП.ПриНастройкеВариантовОтчетов(Результат);
		ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов(Результат);
	КонецЕсли;
	
	ЗаполнитьОчищенныеНаименования(Результат, КэшРезультата);
	
	// Определение основных вариантов отчетов.
	Для Каждого ОписаниеОтчета Из Результат.НайтиСтроки(Новый Структура("ЭтоВариант", Ложь)) Цикл
		
		Если Не ОписаниеОтчета.ГруппироватьПоОтчету Тогда
			ОписаниеОтчета.ОсновнойВариант = "";
			Продолжить;
		КонецЕсли;
		
		ЕстьОсновойВариант = Не ПустаяСтрока(ОписаниеОтчета.ОсновнойВариант);
		ОсновойВариантВключен = Ложь;
		Если ЕстьОсновойВариант Тогда
			ПоискОписания = Новый Структура();
			ПоискОписания.Вставить("Отчет", ОписаниеОтчета.Отчет);
			ПоискОписания.Вставить("КлючВарианта", ОписаниеОтчета.ОсновнойВариант);
			ПоискОписания.Вставить("ЭтоВариант", Истина);
			
			НайденныеОписания = Результат.НайтиСтроки(ПоискОписания);
			Описание = НайденныеОписания[0]; // см. ОписаниеОтчетаПоУмолчанию
			
			ОсновойВариантВключен = Описание.Включен;
		КонецЕсли;
		
		Если Не ЕстьОсновойВариант Или Не ОсновойВариантВключен Тогда
			ПоискОписания = Новый Структура("Отчет", ОписаниеОтчета.Отчет);
			НайденныеОписания = Результат.НайтиСтроки(ПоискОписания);
			
			Для Каждого ОписаниеВарианта Из НайденныеОписания Цикл
				Если ПустаяСтрока(ОписаниеВарианта.КлючВарианта) Тогда
					Продолжить;
				КонецЕсли;
				
				ЗаполнитьОписаниеСтрокиВарианта(ОписаниеВарианта, ОписаниеОтчета);
				
				Если ОписаниеВарианта.Включен Тогда
					ОписаниеОтчета.ОсновнойВариант = ОписаниеВарианта.КлючВарианта;
					ОписаниеВарианта.ВидимостьПоУмолчанию = Истина;
					Прервать;
				КонецЕсли;
			КонецЦикла;
		КонецЕсли;

	КонецЦикла;
	
	Возврат Результат;
КонецФункции

// Определяет подключен ли отчет к хранилищу вариантов отчетов.
Функция ОтчетПодключенКХранилищу(ОтчетМетаданные, ПоУмолчаниюВсеПодключены = Неопределено) Экспорт
	ХранилищеМетаданные = ОтчетМетаданные.ХранилищеВариантов;
	Если ХранилищеМетаданные = Неопределено Тогда
		Если ПоУмолчаниюВсеПодключены = Неопределено Тогда
			ПоУмолчаниюВсеПодключены = ПоУмолчаниюВсеПодключеныКХранилищу();
		КонецЕсли;
		ОтчетПодключен = ПоУмолчаниюВсеПодключены;
	Иначе
		ОтчетПодключен = (ХранилищеМетаданные = Метаданные.ХранилищаНастроек.ХранилищеВариантовОтчетов);
	КонецЕсли;
	Возврат ОтчетПодключен;
КонецФункции

// Определяет подключен-ли отчет к общей форме отчета.
Функция ОтчетПодключенКОсновнойФорме(ОтчетМетаданные, ПоУмолчаниюВсеПодключены = Неопределено) Экспорт
	ФормаМетаданные = ОтчетМетаданные.ОсновнаяФорма;
	Если ФормаМетаданные = Неопределено Тогда
		Если ПоУмолчаниюВсеПодключены = Неопределено Тогда
			ПоУмолчаниюВсеПодключены = ПоУмолчаниюВсеПодключеныКОсновнойФорме();
		КонецЕсли;
		ОтчетПодключен = ПоУмолчаниюВсеПодключены;
	Иначе
		ОтчетПодключен = (ФормаМетаданные = Метаданные.ОбщиеФормы.ФормаОтчета);
	КонецЕсли;
	Возврат ОтчетПодключен;
КонецФункции

// Определяет подключен-ли отчет к общей форме настроек отчета.
Функция ОтчетПодключенКФормеНастроек(ОтчетМетаданные, ПоУмолчаниюВсеПодключены = Неопределено) Экспорт
	ФормаМетаданные = ОтчетМетаданные.ОсновнаяФормаНастроек;
	Если ФормаМетаданные = Неопределено Тогда
		Если ПоУмолчаниюВсеПодключены = Неопределено Тогда
			ПоУмолчаниюВсеПодключены = ПоУмолчаниюВсеПодключеныКФормеНастроек();
		КонецЕсли;
		ОтчетПодключен = ПоУмолчаниюВсеПодключены;
	Иначе
		ОтчетПодключен = (ФормаМетаданные = Метаданные.ОбщиеФормы.ФормаНастроекОтчета);
	КонецЕсли;
	Возврат ОтчетПодключен;
КонецФункции

// Список объектов, в которых используются команды отчетов.
//
// Возвращаемое значение:
//   Массив из ОбъектМетаданных - объекты метаданных с командами отчетов.
//
Функция ОбъектыСКомандамиОтчетов() Экспорт
	
	Результат = Новый Массив;
	ИнтеграцияПодсистемБСП.ПриОпределенииОбъектовСКомандамиОтчетов(Результат);
	ВариантыОтчетовПереопределяемый.ОпределитьОбъектыСКомандамиОтчетов(Результат);
	Возврат Результат;
	
КонецФункции

////////////////////////////////////////////////////////////////////////////////
// Обработчики событий подсистем конфигурации.

// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления.
Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт
	
	////////////////////////////////////////////////////////////////////////////////
	// 1. Обновление общих данных.
	
	Обработчик = Обработчики.Добавить();
	Обработчик.УправлениеОбработчиками = Истина;
	Обработчик.ОбщиеДанные     = Истина;
	Обработчик.РежимВыполнения = "Оперативно";
	Обработчик.Версия          = "*";
	Обработчик.Процедура       = "ВариантыОтчетов.ОперативноеОбновлениеОбщихДанныхКонфигурации";
	Обработчик.Приоритет       = 90;
	
	////////////////////////////////////////////////////////////////////////////////
	// 2. Обновление разделенных данных.
	
	// 2.3. Обновить разделенные данные в локальном режиме.
	Обработчик = Обработчики.Добавить();
	Обработчик.ВыполнятьВГруппеОбязательных = Истина;
	Обработчик.ОбщиеДанные     = Ложь;
	Обработчик.РежимВыполнения = "Оперативно";
	Обработчик.Версия          = "*";
	Обработчик.Приоритет       = 70;
	Обработчик.Процедура       = "ВариантыОтчетов.ОперативноеОбновлениеРазделенныхДанныхКонфигурации";
	
	// 2.4. Обновить служебного пользователя для обновления представлений.
	Обработчик = Обработчики.Добавить();
	Обработчик.ВыполнятьВГруппеОбязательных = Истина;
	Обработчик.ОбщиеДанные     = Ложь;
	Обработчик.РежимВыполнения = "Оперативно";
	Обработчик.Версия          = "3.1.2.205";
	Обработчик.Приоритет       = 99;
	Обработчик.Процедура       = "ВариантыОтчетов.ОперативноеОбновлениеСлужебногоПользователя";
	
	////////////////////////////////////////////////////////////////////////////////
	// 3. Отложенное обновление.
	
	// 3.2. Заполнить информацию для поиска предопределенных вариантов отчетов.
	Если РазрешеноИндексированиеНеразделенныхДанных() Тогда
		Обработчик = Обработчики.Добавить();
		Если ОбщегоНазначения.РазделениеВключено() Тогда
			Обработчик.РежимВыполнения = "Оперативно";
			Обработчик.ОбщиеДанные     = Истина;
		Иначе
			Обработчик.РежимВыполнения = "Отложенно";
			Обработчик.ОбщиеДанные     = Ложь; 
		КонецЕсли;
		Обработчик.Идентификатор = Новый УникальныйИдентификатор("38d2a135-53e0-4c68-9bd6-3d6df9b9dcfb");
		Обработчик.Версия        = "*";
		Обработчик.Процедура     = "ВариантыОтчетов.ОбновитьИндексПоискаПредопределенныхВариантовОтчетов";
		Обработчик.Комментарий   = НСтр("ru = 'Обновление индекса поиска отчетов, предусмотренных в программе.'");
	КонецЕсли;
	
	// 3.3. Заполнить информацию для поиска пользовательских вариантов отчетов.
	Обработчик = Обработчики.Добавить();
	Обработчик.РежимВыполнения = "Отложенно";
	Обработчик.ОбщиеДанные     = Ложь;
	Обработчик.Идентификатор   = Новый УникальныйИдентификатор("5ba93197-230b-4ac8-9abb-ab3662e5ff76");
	Обработчик.Версия          = "*";
	Обработчик.Процедура       = "ВариантыОтчетов.ОбновитьИндексПоискаПользовательскихВариантовОтчетов";
	Обработчик.Комментарий     = НСтр("ru = 'Обновление индекса поиска отчетов, сохраненных пользователями.'");
	
	// 3.4. Установить соответствующие ссылки на идентификаторы объектов метаданных в настройках вариантов универсального отчета.
	Обработчик = Обработчики.Добавить();
	Обработчик.Версия = "3.1.9.5";
	Обработчик.Идентификатор = Новый УникальныйИдентификатор("6cd3c6c1-6919-4e18-9725-eb6dbb841f4a");
	Обработчик.РежимВыполнения = "Отложенно";
	Обработчик.ПроцедураЗаполненияДанныхОбновления = "Справочники.ВариантыОтчетов.ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию";
	Обработчик.Процедура = "Справочники.ВариантыОтчетов.ОбработатьДанныеДляПереходаНаНовуюВерсию";
	Обработчик.ЧитаемыеОбъекты = "Справочник.ВариантыОтчетов";
	Обработчик.ИзменяемыеОбъекты = "Справочник.ВариантыОтчетов";
	Обработчик.БлокируемыеОбъекты = "Справочник.ВариантыОтчетов";
	Обработчик.ПроцедураПроверки = "ОбновлениеИнформационнойБазы.ДанныеОбновленыНаНовуюВерсиюПрограммы";
	Обработчик.Комментарий = НСтр("ru = 'Установка источника данных в настройках вариантов универсального отчета.
		|После завершения обработки, переименование объектов метаданных не приведет к потере сохраненных вариантов отчетов.
		|Заполнение назначения в вариантах отчетов значением Для компьютеров и планшетов'");
	
	Обработчик.ПриоритетыВыполнения = ОбновлениеИнформационнойБазы.ПриоритетыВыполненияОбработчика();
	Приоритет = Обработчик.ПриоритетыВыполнения.Добавить();
	Приоритет.Процедура = "РегистрыСведений.НастройкиВариантовОтчетов.ОбработатьДанныеДляПереходаНаНовуюВерсию";
	Приоритет.Порядок = "До";
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда
		НоваяСтрока = Обработчик.ПриоритетыВыполнения.Добавить();
		НоваяСтрока.Процедура = "МультиязычностьСервер.ОбработатьДанныеДляПереходаНаНовуюВерсию";
		НоваяСтрока.Порядок = "До";
	КонецЕсли;
	
	// 3.5. Зарегистрировать настройки доступности вариантов отчетов в разрезе пользователей (групп пользователей).
	Обработчик = Обработчики.Добавить();
	Обработчик.Версия = "3.1.2.64";
	Обработчик.Идентификатор = Новый УникальныйИдентификатор("eba9f8fb-2755-4d1a-99f5-cdd132e48cfc");
	Обработчик.РежимВыполнения = "Отложенно";
	Обработчик.ПроцедураЗаполненияДанныхОбновления = "РегистрыСведений.НастройкиВариантовОтчетов.ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию";
	Обработчик.Процедура = "РегистрыСведений.НастройкиВариантовОтчетов.ОбработатьДанныеДляПереходаНаНовуюВерсию";
	Обработчик.ЧитаемыеОбъекты = "Справочник.ВариантыОтчетов";
	Обработчик.ИзменяемыеОбъекты = "Справочник.ВариантыОтчетов";
	Обработчик.БлокируемыеОбъекты = "Справочник.ВариантыОтчетов, РегистрСведений.НастройкиВариантовОтчетов";
	Обработчик.ПроцедураПроверки = "ОбновлениеИнформационнойБазы.ДанныеОбновленыНаНовуюВерсиюПрограммы";
	Обработчик.Комментарий = НСтр("ru = 'Перенос всех настроек доступности вариантов отчетов в регистр сведений ""Настройки вариантов отчетов"".
		|До завершения обработки, настройка доступности вариантов отчетов в разрезе пользователей (групп пользователей) будет работать некорректно.'");
	
	Обработчик.ПриоритетыВыполнения = ОбновлениеИнформационнойБазы.ПриоритетыВыполненияОбработчика();
	Приоритет = Обработчик.ПриоритетыВыполнения.Добавить();
	Приоритет.Процедура = "Справочники.ВариантыОтчетов.ОбработатьДанныеДляПереходаНаНовуюВерсию";
	Приоритет.Порядок = "После";
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда
		НоваяСтрока = Обработчик.ПриоритетыВыполнения.Добавить();
		НоваяСтрока.Процедура = "МультиязычностьСервер.ОбработатьДанныеДляПереходаНаНовуюВерсию";
		НоваяСтрока.Порядок = "До";
	КонецЕсли;
	
КонецПроцедуры

// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииИсключенийПоискаСсылок.
Процедура ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоискаСсылок) Экспорт
	
	ИсключенияПоискаСсылок.Добавить(Метаданные.Справочники.ВариантыОтчетов.ТабличныеЧасти.Размещение.Реквизиты.Подсистема);
	
КонецПроцедуры

// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииПереименованийОбъектовМетаданных.
Процедура ПриДобавленииПереименованийОбъектовМетаданных(Итог) Экспорт
	
	Библиотека = "СтандартныеПодсистемы";
	
	ОбщегоНазначения.ДобавитьПереименование(
		Итог, "2.1.0.2", "Роль.ЧтениеВариантовОтчетов", "Роль.ИспользованиеВариантовОтчетов", Библиотека);
	ОбщегоНазначения.ДобавитьПереименование(
		Итог, "2.3.3.3", "Роль.ИспользованиеВариантовОтчетов", "Роль.ДобавлениеИзменениеЛичныхВариантовОтчетов", Библиотека);
	
КонецПроцедуры

// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповОбщихДанныхПоддерживающихСопоставлениеСсылокПриЗагрузке.
Процедура ПриЗаполненииТиповОбщихДанныхПоддерживающихСопоставлениеСсылокПриЗагрузке(Типы) Экспорт
	
	Типы.Добавить(Метаданные.Справочники.ПредопределенныеВариантыОтчетов);
	
КонецПроцедуры

// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки.
Процедура ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы) Экспорт
	
	МодульВыгрузкаЗагрузкаДанных = ОбщегоНазначения.ОбщийМодуль("ВыгрузкаЗагрузкаДанных");
	МодульВыгрузкаЗагрузкаДанных.ДополнитьТипомИсключаемымИзВыгрузкиЗагрузки(Типы,
		Метаданные.Справочники.ПредопределенныеВариантыОтчетовРасширений,
		МодульВыгрузкаЗагрузкаДанных.ДействиеСоСсылкамиНеИзменять());
	Типы.Добавить(Метаданные.РегистрыСведений.ПредопределенныеВариантыОтчетовВерсийРасширений);
	
КонецПроцедуры

// См. ЗагрузкаДанныхИзФайлаПереопределяемый.ПриОпределенииСправочниковДляЗагрузкиДанных.
Процедура ПриОпределенииСправочниковДляЗагрузкиДанных(ЗагружаемыеСправочники) Экспорт
	
	// Загрузка в справочник ПользовательскиеНастройкиОтчетов запрещена.
	СтрокаТаблицы = ЗагружаемыеСправочники.Найти(Метаданные.Справочники.ПользовательскиеНастройкиОтчетов.ПолноеИмя(), "ПолноеИмя");
	Если СтрокаТаблицы <> Неопределено Тогда 
		ЗагружаемыеСправочники.Удалить(СтрокаТаблицы);
	КонецЕсли;
	
КонецПроцедуры

// См. ГрупповоеИзменениеОбъектовПереопределяемый.ПриОпределенииОбъектовСРедактируемымиРеквизитами.
Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт
	Объекты.Вставить(Метаданные.Справочники.ВариантыОтчетов.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
	Объекты.Вставить(Метаданные.Справочники.ПользовательскиеНастройкиОтчетов.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
	Объекты.Вставить(Метаданные.Справочники.ПредопределенныеВариантыОтчетов.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
	Объекты.Вставить(Метаданные.Справочники.ПредопределенныеВариантыОтчетовРасширений.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
КонецПроцедуры

// См. ПользователиПереопределяемый.ПриОпределенииНазначенияРолей
Процедура ПриОпределенииНазначенияРолей(НазначениеРолей) Экспорт
	
	// СовместноДляПользователейИВнешнихПользователей.
	НазначениеРолей.СовместноДляПользователейИВнешнихПользователей.Добавить(
		Метаданные.Роли.ДобавлениеИзменениеЛичныхВариантовОтчетов.Имя);
	
КонецПроцедуры

// См. РегистрыСведений.ПараметрыРаботыВерсийРасширений.ЗаполнитьВсеПараметрыРаботыРасширений.
Процедура ПриЗаполненииВсехПараметровРаботыРасширений() Экспорт
	
	Настройки = ПараметрыОбновленияНастроек();
	Настройки.Конфигурация = Ложь;
	Настройки.Расширения = Истина;
	Настройки.ОбщиеДанные = Истина;
	Настройки.РазделенныеДанные = Истина;
	Настройки.Оперативное = Истина;
	Настройки.Отложенное = Истина;
	
	Обновить(Настройки);
	
КонецПроцедуры

// См. РегистрыСведений.ПараметрыРаботыВерсийРасширений.ОчиститьВсеПараметрыРаботыРасширений.
Процедура ПриОчисткеВсехПараметровРаботыРасширений() Экспорт
	
	НаборЗаписей = РегистрыСведений.ПредопределенныеВариантыОтчетовВерсийРасширений.СоздатьНаборЗаписей();
	НаборЗаписей.Отбор.ВерсияРасширений.Установить(ПараметрыСеанса.ВерсияРасширений);
	НаборЗаписей.Записать();
	
КонецПроцедуры

// См. ПодключаемыеКомандыПереопределяемый.ПриОпределенииСоставаНастроекПодключаемыхОбъектов.
Процедура ПриОпределенииСоставаНастроекПодключаемыхОбъектов(НастройкиПрограммногоИнтерфейса) Экспорт
	Настройка = НастройкиПрограммногоИнтерфейса.Добавить();
	Настройка.Ключ          = "ДобавитьКомандыОтчетов";
	Настройка.ОписаниеТипов = Новый ОписаниеТипов("Булево");
	
	Настройка = НастройкиПрограммногоИнтерфейса.Добавить();
	Настройка.Ключ          = "НастроитьВариантыОтчета";
	Настройка.ОписаниеТипов = Новый ОписаниеТипов("Булево");
	Настройка.ВидыПодключаемыхОбъектов = "ОТЧЕТ";
	
	Настройка = НастройкиПрограммногоИнтерфейса.Добавить();
	Настройка.Ключ          = "ОпределитьНастройкиФормы";
	Настройка.ОписаниеТипов = Новый ОписаниеТипов("Булево");
	Настройка.ВидыПодключаемыхОбъектов = "ОТЧЕТ";
КонецПроцедуры

// См. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.
// 
// Параметры:
//   ВидыПодключаемыхКоманд - ТаблицаЗначений - поддерживаемые виды команд, где:
//       * Имя - Строка - имя вида команд.
//       * ИмяПодменю - Строка - имя подменю для размещения команд этого вида на формах объектов.
//       * Заголовок - Строка - наименование подменю, выводимое пользователю.
//       * Картинка - Картинка - картинка подменю.
//       * Отображение - ОтображениеКнопки - режим отображения подменю.
//       * Порядок - Число - порядок подменю в командной панели формы.
//
Процедура ПриОпределенииВидовПодключаемыхКоманд(ВидыПодключаемыхКоманд) Экспорт
	Вид = ВидыПодключаемыхКоманд.Добавить();
	Вид.Имя         = "Отчеты";
	Вид.ИмяПодменю  = "ПодменюОтчеты";
	Вид.Заголовок   = НСтр("ru = 'Отчеты'");
	Вид.Порядок     = 50;
	Вид.Картинка    = БиблиотекаКартинок.Отчет;
	Вид.Отображение = ОтображениеКнопки.КартинкаИТекст;
КонецПроцедуры

// См. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.
Процедура ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, Источники, ПодключенныеОтчетыИОбработки, Команды) Экспорт
	КомандыОтчетов = Команды.СкопироватьКолонки();
	КомандыОтчетов.Колонки.Добавить("КлючВарианта", Новый ОписаниеТипов("Строка, Null"));
	КомандыОтчетов.Колонки.Добавить("Обработана", Новый ОписаниеТипов("Булево"));
	КомандыОтчетов.Индексы.Добавить("Обработана");
	
	СтандартнаяОбработка = Источники.Строки.Количество() > 0;
	НастройкиФормы.Вставить("Источники", Источники);
	
	ИнтеграцияПодсистемБСП.ПередДобавлениемКомандОтчетов(КомандыОтчетов, НастройкиФормы, СтандартнаяОбработка);
	ВариантыОтчетовПереопределяемый.ПередДобавлениемКомандОтчетов(КомандыОтчетов, НастройкиФормы, СтандартнаяОбработка);
	КомандыОтчетов.ЗаполнитьЗначения(Истина, "Обработана");
	Если СтандартнаяОбработка Тогда
		ОбъектыСКомандамиОтчетов = ОбъектыСКомандамиОтчетов();
		Для Каждого Источник Из Источники.Строки Цикл
			Для Каждого ДокументРегистратор Из Источник.Строки Цикл
				Если ОбъектыСКомандамиОтчетов.Найти(ДокументРегистратор.Метаданные) <> Неопределено Тогда
					ПриДобавленииКомандОтчетов(КомандыОтчетов, ДокументРегистратор, НастройкиФормы);
				КонецЕсли;
			КонецЦикла;
			Если ОбъектыСКомандамиОтчетов.Найти(Источник.Метаданные) <> Неопределено Тогда
				ПриДобавленииКомандОтчетов(КомандыОтчетов, Источник, НастройкиФормы);
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;
	
	Найденные = ПодключенныеОтчетыИОбработки.НайтиСтроки(Новый Структура("ДобавитьКомандыОтчетов", Истина));
	Для Каждого ПодключенныйОбъект Из Найденные Цикл
		ПриДобавленииКомандОтчетов(КомандыОтчетов, ПодключенныйОбъект, НастройкиФормы);
	КонецЦикла;
	
	ИменаКлючевыхПараметровКоманды = "Идентификатор,Представление,ФункциональныеОпции,Менеджер,ИмяФормы,КлючВарианта,
	|ИмяПараметраФормы,ПараметрыФормы,Обработчик,ДополнительныеПараметры,ВидимостьВФормах";
	
	ДобавленныеКоманды = Новый Соответствие;
	
	Для Каждого КомандаОтчетов Из КомандыОтчетов Цикл
		КлючевыеПараметры = Новый Структура(ИменаКлючевыхПараметровКоманды);
		ЗаполнитьЗначенияСвойств(КлючевыеПараметры, КомандаОтчетов);
		УникальныйИдентификатор = ОбщегоНазначения.КонтрольнаяСуммаСтрокой(КлючевыеПараметры);
		
		НайденнаяКоманда = ДобавленныеКоманды[УникальныйИдентификатор];
		Если НайденнаяКоманда <> Неопределено И ЗначениеЗаполнено(НайденнаяКоманда.ТипПараметра) Тогда
			Если ЗначениеЗаполнено(КомандаОтчетов.ТипПараметра) Тогда
				НайденнаяКоманда.ТипПараметра = Новый ОписаниеТипов(НайденнаяКоманда.ТипПараметра, КомандаОтчетов.ТипПараметра.Типы());
			Иначе
				НайденнаяКоманда.ТипПараметра = Неопределено;
			КонецЕсли;
			Продолжить;
		КонецЕсли;
		
		Команда = Команды.Добавить();
		ДобавленныеКоманды.Вставить(УникальныйИдентификатор, Команда);
		
		ЗаполнитьЗначенияСвойств(Команда, КомандаОтчетов);
		Команда.Вид = "Отчеты";
		Если Команда.Порядок = 0 Тогда
			Команда.Порядок = 50;
		КонецЕсли;
		Если Команда.РежимЗаписи = "" Тогда
			Команда.РежимЗаписи = "ЗаписыватьТолькоНовые";
		КонецЕсли;
		Если Команда.МножественныйВыбор = Неопределено Тогда
			Команда.МножественныйВыбор = Истина;
		КонецЕсли;
		Если ПустаяСтрока(Команда.ИмяФормы) И ПустаяСтрока(Команда.Обработчик) Тогда
			Команда.ИмяФормы = "Форма";
		КонецЕсли;
		Если Команда.ПараметрыФормы = Неопределено Тогда
			Команда.ПараметрыФормы = Новый Структура;
		КонецЕсли;
		Команда.ПараметрыФормы.Вставить("КлючВарианта", КомандаОтчетов.КлючВарианта);
		Если ПустаяСтрока(Команда.Обработчик) И Не Команда.ПараметрыФормы.Свойство("СформироватьПриОткрытии") Тогда
			Команда.ПараметрыФормы.Вставить("СформироватьПриОткрытии", Истина);
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры

// См. УправлениеДоступомПереопределяемый.ПриЗаполненииСписковСОграничениемДоступа.
Процедура ПриЗаполненииСписковСОграничениемДоступа(Списки) Экспорт
	
	Списки.Вставить(Метаданные.Справочники.ВариантыОтчетов, Истина);
	Списки.Вставить(Метаданные.Справочники.ПользовательскиеНастройкиОтчетов, Истина);
	Списки.Вставить(Метаданные.РегистрыСведений.НастройкиВариантовОтчетов, Истина);
	Списки.Вставить(Метаданные.РегистрыСведений.СнимкиОтчетов, Истина);
	
КонецПроцедуры

// См. ЦентрМониторингаПереопределяемый.ПриСбореПоказателейСтатистикиКонфигурации.
Процедура ПриСбореПоказателейСтатистикиКонфигурации() Экспорт
	
	Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЦентрМониторинга") Тогда
		Возврат;
	КонецЕсли;
	
	МодульЦентрМониторинга = ОбщегоНазначения.ОбщийМодуль("ЦентрМониторинга");
	
	ТекстЗапроса = 
	"ВЫБРАТЬ
	|	КОЛИЧЕСТВО(1) КАК Количество
	|ИЗ
	|	Справочник.ВариантыОтчетов КАК ВариантыОтчетов
	|ГДЕ
	|	ВариантыОтчетов.Пользовательский";
	
	Запрос = Новый Запрос(ТекстЗапроса);
	Выборка = Запрос.Выполнить().Выбрать();
	Выборка.Следующий();
	
	МодульЦентрМониторинга.ЗаписатьСтатистикуОбъектаКонфигурации("Справочник.ВариантыОтчетов.Пользовательский", Выборка.Количество());
	
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

// Представление подсистемы. Используется при записи в журнал регистрации и в других местах.
Функция НаименованиеПодсистемы(КодЯзыка)
	Возврат НСтр("ru = 'Варианты отчетов'", ?(КодЯзыка = Неопределено, ОбщегоНазначения.КодОсновногоЯзыка(), КодЯзыка));
КонецФункции

// Инициализация отчетов.

// Получает объект отчета по ссылке варианта отчета.
//
// Параметры:
//   СсылкаОтчета
//     - СправочникСсылка.ИдентификаторыОбъектовМетаданных - ссылка отчета конфигурации.
//     - СправочникСсылка.ИдентификаторыОбъектовРасширений - ссылка отчета расширения.
//     - Произвольный - ссылка дополнительного или внешнего отчета.
//
// Возвращаемое значение:
//   Структура - параметры отчета, в том числе Объект отчета:
//       * Объект      - ОтчетОбъект
//                     - ВнешнийОтчет - объект отчета.
//       * Имя         - Строка           - имя объекта отчета.
//       * ПолноеИмя   - Строка           - полное имя объекта отчета.
//       * Метаданные  - ОбъектМетаданных - объект метаданных отчета.
//       * Ссылка      - Произвольный     - ссылка отчета.
//       * Успех       - Булево           - Истина если удалось подключить отчет.
//       * ТекстОшибки - Строка           - текст ошибки.
//
// Места использования:
//   РассылкаОтчетов.ИнициализироватьОтчет().
//
Функция ПодключитьОтчетОбъект(СсылкаОтчета, ПолучатьМетаданные)
	Результат = Новый Структура("Объект, Имя, ПолноеИмя, Метаданные, Ссылка, ТекстОшибки");
	Результат.Вставить("Успех", Ложь);
	
	Если СсылкаОтчета = Неопределено Тогда
		Результат.ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'В методе ""%1"" не указан параметр ""%2"".'"),
			"ПодключитьОтчетОбъект",
			"СсылкаОтчета");
		Возврат Результат;
	Иначе
		Результат.Ссылка = СсылкаОтчета;
	КонецЕсли;
	
	Если ТипЗнч(Результат.Ссылка) = Тип("Строка") Тогда
		Результат.ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Отчет ""%1"" записан как внешний и не может быть подключен из программы'"),
			Результат.Ссылка);
		Возврат Результат;
	КонецЕсли;
	
	Если ТипЗнч(Результат.Ссылка) = Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных")
	 Или ТипЗнч(Результат.Ссылка) = Тип("СправочникСсылка.ИдентификаторыОбъектовРасширений") Тогда
		
		Результат.Метаданные = ОбщегоНазначения.ОбъектМетаданныхПоИдентификатору(
			Результат.Ссылка, Ложь);
		
		Если ТипЗнч(Результат.Метаданные) <> Тип("ОбъектМетаданных") Тогда
			Результат.ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Отчет ""%1"" не существует в программе'"),
				Результат.Имя);
			Возврат Результат;
		КонецЕсли;
		Результат.Имя = Результат.Метаданные.Имя;
		Если Не ПравоДоступа("Использование", Результат.Метаданные) Тогда
			Результат.ТекстОшибки = НСтр("ru = 'Недостаточно прав доступа'");
			Возврат Результат;
		КонецЕсли;
		Попытка
			Результат.Объект = Отчеты[Результат.Имя].Создать();
			Результат.Успех = Истина;
		Исключение
			ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не удалось подключить отчет %1:'"),
				Результат.Метаданные);
			ТекстОшибки = ТекстОшибки + Символы.ПС + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
			ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Ошибка, ТекстОшибки, Результат.Метаданные);
		КонецПопытки;
	Иначе
		Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда
			МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки");
			МодульДополнительныеОтчетыИОбработки.ПриПодключенииДопОтчета(Результат.Ссылка, Результат, Результат.Успех, ПолучатьМетаданные);
		КонецЕсли;
	КонецЕсли;
	
	Если Результат.Успех И ПолучатьМетаданные Тогда
		Результат.ПолноеИмя = Результат.Метаданные.ПолноеИмя();
	КонецЕсли;
	
	Возврат Результат;
КонецФункции

// Компоновка данных.

// Формирует отчет с указанными настройками, используется в фоновых заданиях.
Процедура СформироватьОтчетВФоне(Параметры, АдресХранилища) Экспорт
	
	РезультатФормированияОтчета = СформироватьОтчет(Параметры, Ложь, Ложь);
	
	Результат = Новый Структура("ТабличныйДокумент, Расшифровка,
		|Успех, ТекстОшибки, ДанныеЕщеОбновляются,
		|ВариантМодифицирован, ПользовательскиеНастройкиМодифицированы");
	ЗаполнитьЗначенияСвойств(Результат, РезультатФормированияОтчета);
	
	Если Результат.ВариантМодифицирован ИЛИ Параметры.ПараметрыИзменены Тогда
		Результат.Вставить("НастройкиКД", РезультатФормированияОтчета.НастройкиКД);
	КонецЕсли;
	Если Результат.ПользовательскиеНастройкиМодифицированы Тогда
		Результат.Вставить("ПользовательскиеНастройкиКД", РезультатФормированияОтчета.ПользовательскиеНастройкиКД);
	КонецЕсли;
	
	ПоместитьВоВременноеХранилище(Результат, АдресХранилища);
	
КонецПроцедуры

// Заполняет описание настроек для строки варианта отчета, если оно еще не заполнено.
//
// Параметры:
//   ОписаниеВарианта - см. ОписаниеОтчетаПоУмолчанию
//   ОписаниеОтчета -  см. ОписаниеОтчетаПоУмолчанию
//
Процедура ЗаполнитьОписаниеСтрокиВарианта(ОписаниеВарианта, ОписаниеОтчета)
	Если ОписаниеВарианта.ОписаниеПолучено Тогда
		Возврат;
	КонецЕсли;
	
	// Флажок изменения настроек
	ОписаниеВарианта.ОписаниеПолучено = Истина;
	
	// Копирование настроек отчета.
	ЗаполнитьЗначенияСвойств(ОписаниеВарианта, ОписаниеОтчета, "Включен, ВидимостьПоУмолчанию, ГруппироватьПоОтчету, ПоказыватьВПодменюВариантов");
	
	Если ОписаниеВарианта.КлючВарианта = ОписаниеОтчета.ОсновнойВариант Тогда
		// Вариант "по умолчанию".
		ОписаниеВарианта.Описание = ОписаниеОтчета.Описание;
		ОписаниеВарианта.ВидимостьПоУмолчанию = Истина;
	Иначе
		// Предопределенный вариант.
		Если ОписаниеВарианта.ГруппироватьПоОтчету Тогда
			ОписаниеВарианта.ВидимостьПоУмолчанию = Ложь;
		КонецЕсли;
	КонецЕсли;
	
	ОписаниеВарианта.Размещение = ОбщегоНазначения.СкопироватьРекурсивно(ОписаниеОтчета.Размещение);
	ОписаниеВарианта.ФункциональныеОпции = ОбщегоНазначения.СкопироватьРекурсивно(ОписаниеОтчета.ФункциональныеОпции);
	ОписаниеВарианта.НастройкиДляПоиска = ОбщегоНазначения.СкопироватьРекурсивно(ОписаниеОтчета.НастройкиДляПоиска);
	
	МетаданныеОтчета = ОписаниеОтчета.Метаданные; // ОбъектМетаданныхОтчет
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОценкаПроизводительности") Тогда 
		ОписаниеВарианта.КлючЗамеров = ВариантыОтчетовСлужебный.КлючЗамеров(
			МетаданныеОтчета.ПолноеИмя(), ОписаниеВарианта.КлючВарианта);
	КонецЕсли;
КонецПроцедуры

// Панели отчетов.

// Формирует список разделов, в которых размещены команды вызова панели отчетов.
//
// Возвращаемое значение:
//   СписокЗначений - см. описание 1 параметра процедуры ВариантыОтчетовПереопределяемый.ОпределитьРазделыСВариантамиОтчетов()
//
Функция СписокРазделов() Экспорт
	СписокРазделов = Новый СписокЗначений;
	
	ИнтеграцияПодсистемБСП.ПриОпределенииРазделовСВариантамиОтчетов(СписокРазделов);
	ВариантыОтчетовПереопределяемый.ОпределитьРазделыСВариантамиОтчетов(СписокРазделов);
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.НастройкиПрограммы") Тогда
		МодульПанельАдминистрированияБСП = ОбщегоНазначения.ОбщийМодуль("Обработки.ПанельАдминистрированияБСП");
		МодульПанельАдминистрированияБСП.ПриОпределенииРазделовСВариантамиОтчетов(СписокРазделов);
	КонецЕсли;
	
	Возврат СписокРазделов;
КонецФункции

// Устанавливает режим вывода вариантов отчета в панелях отчетов.
//
// Параметры:
//   Настройки - ТаблицаЗначений - передается "как есть" из процедуры НастроитьВариантыОтчетов.
//   Отчет - СтрокаТаблицыЗначений:
//         - ОбъектМетаданныхОтчет - описание настроек или метаданные отчета.
//   ГруппироватьПоОтчетам - Булево - режим вывода в панели отчетов.
//                           Если Истина, то по отчетам (варианты скрыты, а отчет включен и видим).
//                           Если Ложь, то по вариантам (варианты видимы, а отчет отключен).
//
Процедура УстановитьРежимВыводаОтчетаВПанеляхОтчетов(Настройки, Отчет, ГруппироватьПоОтчетам)
	Если ТипЗнч(Отчет) = Тип("СтрокаТаблицыЗначений") Тогда
		ОписаниеОтчета = Отчет;
	Иначе
		ОписаниеОтчета = Настройки.НайтиСтроки(Новый Структура("Метаданные,ЭтоВариант", Отчет, Ложь));
		Если ОписаниеОтчета.Количество() <> 1 Тогда
			ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Предупреждение, 
				СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					НСтр("ru = 'Отчет ""%1"" не подключен к подсистеме.'"), Отчет.Имя));
			Возврат;
		КонецЕсли;
		ОписаниеОтчета = ОписаниеОтчета[0];
	КонецЕсли;
	ОписаниеОтчета.ГруппироватьПоОтчету = ГруппироватьПоОтчетам;
КонецПроцедуры

// Формирует таблицу замен старых ключей вариантов на актуальные.
//
// Возвращаемое значение:
//   ТаблицаЗначений - таблица изменений имен вариантов. Колонки:
//       * ОтчетМетаданные - ОбъектМетаданныхОтчет - метаданные отчета, в схеме которого изменилось имя варианта.
//       * СтароеИмяВарианта - Строка - старое имя варианта, до изменения.
//       * АктуальноеИмяВарианта - Строка - текущее (последнее актуальное) имя варианта.
//       * Отчет - СправочникСсылка.ИдентификаторыОбъектовМетаданных
//               - Строка - ссылка или имя отчета,
//           использующееся для хранения.
//
// См. также:
//   ВариантыОтчетовПереопределяемый.ЗарегистрироватьИзмененияКлючейВариантовОтчетов().
//
Функция ИзмененияКлючей()
	
	РеквизитыВариантов = Метаданные.Справочники.ВариантыОтчетов.Реквизиты;
	
	Изменения = Новый ТаблицаЗначений;
	Изменения.Колонки.Добавить("Отчет",                 Новый ОписаниеТипов("ОбъектМетаданных"));
	Изменения.Колонки.Добавить("СтароеИмяВарианта",     РеквизитыВариантов.КлючВарианта.Тип);
	Изменения.Колонки.Добавить("АктуальноеИмяВарианта", РеквизитыВариантов.КлючВарианта.Тип);
	
	// Переопределяемая часть.
	ИнтеграцияПодсистемБСП.ПриИзмененииКлючейВариантовОтчетов(Изменения);
	ВариантыОтчетовПереопределяемый.ЗарегистрироватьИзмененияКлючейВариантовОтчетов(Изменения);
	
	Изменения.Колонки.Найти("Отчет").Имя = "ОтчетМетаданные";
	Изменения.Колонки.Добавить("Отчет", РеквизитыВариантов.Отчет.Тип);
	Изменения.Индексы.Добавить("ОтчетМетаданные, СтароеИмяВарианта");
	
	// Проверить корректность замен.
	Для Каждого Изменение Из Изменения Цикл
		Изменение.Отчет = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(Изменение.ОтчетМетаданные);
		Найденные = Изменения.НайтиСтроки(Новый Структура("ОтчетМетаданные, СтароеИмяВарианта", Изменение.ОтчетМетаданные, Изменение.АктуальноеИмяВарианта));
		Если Найденные.Количество() > 0 Тогда
			Конфликт = Найденные[0];
			ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Конфликт переименования варианта отчета ""%1"":
				|Актуальное имя варианта ""%2"" (старое имя ""%3"")
				|также числится как старое имя ""%4"" (актуальное имя ""%5"").'"),
				Строка(Изменение.Отчет),
				Изменение.АктуальноеИмяВарианта,
				Изменение.СтароеИмяВарианта,
				Конфликт.СтароеИмяВарианта,
				Конфликт.АктуальноеИмяВарианта);
		КонецЕсли;
		Найденные = Изменения.НайтиСтроки(Новый Структура("ОтчетМетаданные, СтароеИмяВарианта", Изменение.ОтчетМетаданные, Изменение.СтароеИмяВарианта));
		Если Найденные.Количество() > 2 Тогда
			Конфликт = Найденные[1];
			ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Конфликт переименования варианта отчета ""%1"":
				|Старое имя варианта ""%2"" (актуальное имя ""%3"")
				|также числится как старое имя варианта отчета ""%4"" (актуальное имя ""%5"").'"),
				Строка(Изменение.Отчет),
				Изменение.СтароеИмяВарианта,
				Изменение.АктуальноеИмяВарианта,
				Строка(Конфликт.ОтчетМетаданные.Представление()),
				Конфликт.АктуальноеИмяВарианта);
		КонецЕсли;
	КонецЦикла;
	
	Возврат Изменения;
КонецФункции

// Формирует таблицу размещения отчетов по подсистемам конфигурации.
//
// Параметры:
//   Результат          - Неопределено - используется для рекурсии.
//   ПодсистемаРодитель - Неопределено - используется для рекурсии.
//
// Возвращаемое значение:
//   ТаблицаЗначений - результат - ТаблицаЗначений - Настройки размещения отчетов по подсистемам:
//       * ОтчетМетаданные      - ОбъектМетаданныхОтчет
//       * ОтчетПолноеИмя       - Строка.
//       * ПодсистемаМетаданные - ОбъектМетаданныхПодсистема
//       * ПодсистемаПолноеИмя  - Строка.
//
Функция РазмещениеОтчетовВПодсистемах(Результат = Неопределено, РодительскаяПодсистема = Неопределено)
	Если Результат = Неопределено Тогда
		ПолноеИмяОписаниеТипов = Метаданные.Справочники.ИдентификаторыОбъектовМетаданных.Реквизиты.ПолноеИмя.Тип;
		
		Результат = Новый ТаблицаЗначений;
		Результат.Колонки.Добавить("ОтчетМетаданные",      Новый ОписаниеТипов("ОбъектМетаданных"));
		Результат.Колонки.Добавить("ОтчетПолноеИмя",       ПолноеИмяОписаниеТипов);
		Результат.Колонки.Добавить("ПодсистемаМетаданные", Новый ОписаниеТипов("ОбъектМетаданных"));
		Результат.Колонки.Добавить("ПодсистемаПолноеИмя",  ПолноеИмяОписаниеТипов);
		
		Результат.Индексы.Добавить("ОтчетПолноеИмя");
		Результат.Индексы.Добавить("ОтчетМетаданные");
		
		РодительскаяПодсистема = Метаданные;
	КонецЕсли;
	
	// Перебор вложенных подсистем родителя.
	Для Каждого ДочерняяПодсистема Из РодительскаяПодсистема.Подсистемы Цикл
		
		Если ДочерняяПодсистема.ВключатьВКомандныйИнтерфейс Тогда
			Для Каждого ОтчетМетаданные Из ДочерняяПодсистема.Состав Цикл
				Если Не Метаданные.Отчеты.Содержит(ОтчетМетаданные) Тогда
					Продолжить;
				КонецЕсли;
				
				СтрокаТаблицы = Результат.Добавить();
				СтрокаТаблицы.ОтчетМетаданные      = ОтчетМетаданные;
				СтрокаТаблицы.ОтчетПолноеИмя       = ОтчетМетаданные.ПолноеИмя();
				СтрокаТаблицы.ПодсистемаМетаданные = ДочерняяПодсистема;
				СтрокаТаблицы.ПодсистемаПолноеИмя  = ДочерняяПодсистема.ПолноеИмя();
				
			КонецЦикла;
		КонецЕсли;
		
		РазмещениеОтчетовВПодсистемах(Результат, ДочерняяПодсистема);
	КонецЦикла;
	
	Возврат Результат;
КонецФункции

// Сброс настроек предопределенного элемента справочника "Варианты отчетов",
//   связанного с элементом справочника "Варианты отчетов".
//
// Параметры:
//   ВариантОбъект - СправочникОбъект.ВариантыОтчетов
//                 - ДанныеФормыСтруктура - вариант отчета.
//
Функция СброситьНастройкиВариантаОтчета(ВариантОбъект) Экспорт
	Если ВариантОбъект.Пользовательский
		Или (ВариантОбъект.ТипОтчета <> Перечисления.ТипыОтчетов.Внутренний
			И ВариантОбъект.ТипОтчета <> Перечисления.ТипыОтчетов.Расширение)
		Или Не ЗначениеЗаполнено(ВариантОбъект.ПредопределенныйВариант) Тогда
		Возврат Ложь;
	КонецЕсли;
	
	ВариантОбъект.Наименование = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(
		ВариантОбъект.ПредопределенныйВариант, "Наименование");
	
	ВариантОбъект.Автор = Неопределено;
	ВариантОбъект.ТолькоДляАвтора = Ложь;
	ВариантОбъект.Описание = "";
	ВариантОбъект.Размещение.Очистить();
	
	Возврат Истина;
КонецФункции

// Формирует описание типов Строка заданной длины.
Функция ОписаниеТиповСтрока(ДлинаСтроки = 1000) Экспорт
	Возврат Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(ДлинаСтроки));
КонецФункции

// По составу ролей определяет полные права к данным подсистемы.
Функция ПолныеПраваНаВарианты() Экспорт
	
	МетаданныеВариантовОтчетов = Метаданные.Справочники.ВариантыОтчетов;
	СтандартныеРеквизиты = МетаданныеВариантовОтчетов.СтандартныеРеквизиты;
	
	ПараметрыДоступа = ПараметрыДоступа("Изменение", МетаданныеВариантовОтчетов, СтандартныеРеквизиты.Ссылка.Имя);
	
	Возврат ПараметрыДоступа.Доступность И Не ПараметрыДоступа.ОграничениеУсловием;
	
КонецФункции

// Проверяет свободно ли наименование варианта отчета.
Функция НаименованиеЗанято(Отчет, Ссылка, Наименование) Экспорт
	Если Наименование = Строка(Ссылка) Тогда
		Возврат Ложь; // Проверка отключается т.к. наименование не изменилось.
	КонецЕсли;
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	ВариантыОтчетов.Представление КАК Наименование
	|ИЗ
	|	Справочник.ВариантыОтчетов КАК ВариантыОтчетов
	|ГДЕ
	|	ВариантыОтчетов.Отчет = &Отчет
	|	И ВариантыОтчетов.Ссылка <> &Ссылка
	|	И НЕ ВариантыОтчетов.ПометкаУдаления
	|	И НЕ ВариантыОтчетов.ПредопределенныйВариант В (&ОтключенныеВариантыПрограммы)";
	
	Запрос.УстановитьПараметр("Отчет",  Отчет);
	Запрос.УстановитьПараметр("Ссылка", Ссылка);
	Запрос.УстановитьПараметр("ОтключенныеВариантыПрограммы", ВариантыОтчетовПовтИсп.ОтключенныеВариантыПрограммы());
	
	УстановитьПривилегированныйРежим(Истина);
	Выборка = Запрос.Выполнить().Выбрать();
	
	Пока Выборка.Следующий() Цикл 
		Если Выборка.Наименование = Наименование Тогда 
			Возврат Истина;
		КонецЕсли;
	КонецЦикла;
	
	Возврат Ложь;
КонецФункции

// Проверяет свободен ли ключ варианта отчета.
Функция КлючВариантаЗанят(Отчет, Ссылка, КлючВарианта) Экспорт
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ ПЕРВЫЕ 1
	|	1 КАК КлючВариантаЗанят
	|ИЗ
	|	Справочник.ВариантыОтчетов КАК ВариантыОтчетов
	|ГДЕ
	|	ВариантыОтчетов.Отчет = &Отчет
	|	И ВариантыОтчетов.Ссылка <> &Ссылка
	|	И ВариантыОтчетов.КлючВарианта = &КлючВарианта
	|	И ВариантыОтчетов.ПометкаУдаления = ЛОЖЬ";
	Запрос.УстановитьПараметр("Отчет",        Отчет);
	Запрос.УстановитьПараметр("Ссылка",       Ссылка);
	Запрос.УстановитьПараметр("КлючВарианта", КлючВарианта);
	
	УстановитьПривилегированныйРежим(Истина);
	Результат = Не Запрос.Выполнить().Пустой();
	УстановитьПривилегированныйРежим(Ложь);
	
	Возврат Результат;
КонецФункции

// Создает фильтр по реквизиту КлючОбъекта для СтандартноеХранилищеНастроекМенеджер.Выбрать().
Функция НовыйФильтрПоКлючуОбъекта(ИменаОтчетов)
	Если ИменаОтчетов = "" Или ИменаОтчетов = "*" Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	ПозицияРазделителя = СтрНайти(ИменаОтчетов, ",");
	Если ПозицияРазделителя = 0 Тогда
		КлючОбъекта = ИменаОтчетов;
		ИменаОтчетов = "";
	Иначе
		КлючОбъекта = СокрЛП(Лев(ИменаОтчетов, ПозицияРазделителя - 1));
		ИменаОтчетов = Сред(ИменаОтчетов, ПозицияРазделителя + 1);
	КонецЕсли;
	
	Если СтрНайти(КлючОбъекта, ".") = 0 Тогда
		КлючОбъекта = "Отчет." + КлючОбъекта;
	КонецЕсли;
	
	Возврат Новый Структура("КлючОбъекта", КлючОбъекта);
КонецФункции

// Глобальные настройки подсистемы.
Функция ГлобальныеНастройки() Экспорт
	Результат = Новый Структура;
	Результат.Вставить("ВыводитьОтчетыВместоВариантов", Ложь);
	Результат.Вставить("ВыводитьОписания", Истина);
	Результат.Вставить("РазрешеноИзменятьВарианты", Истина);
	Результат.Вставить("ВыводитьОбщиеНастройкиКолонтитулов", Истина);
	Результат.Вставить("ВыводитьИндивидуальныеНастройкиКолонтитулов", Истина);
	
	Результат.Вставить("Поиск", Новый Структура);
	Результат.Поиск.Вставить("ПодсказкаВвода", НСтр("ru = 'Наименование, поле или автор отчета'"));
	
	Результат.Вставить("ДругиеОтчеты", Новый Структура);
	Результат.ДругиеОтчеты.Вставить("ЗакрыватьПослеВыбора", Истина);
	Результат.ДругиеОтчеты.Вставить("ПоказыватьФлажок", Ложь);
	
	ИнтеграцияПодсистемБСП.ПриОпределенииНастроекВариантовОтчетов(Результат);
	ВариантыОтчетовПереопределяемый.ПриОпределенииНастроек(Результат);
	
	Возврат Результат;
КонецФункции

// Глобальные настройки панели отчетов.
Функция ОбщиеНастройкиПанели() Экспорт
	ОбщиеНастройки = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить(
		ВариантыОтчетовКлиентСервер.ПолноеИмяПодсистемы(),
		"ПанельОтчетов");
	Если ОбщиеНастройки = Неопределено Тогда
		ОбщиеНастройки = Новый Структура("ПоказыватьПодсказки, ИскатьВоВсехРазделах, ОтображатьВсеВариантыОтчетов");
		ОбщиеНастройки.ПоказыватьПодсказки = ГлобальныеНастройки().ВыводитьОписания;
		ОбщиеНастройки.ИскатьВоВсехРазделах = Ложь;
		ОбщиеНастройки.ОтображатьВсеВариантыОтчетов	= Ложь;
	Иначе
		Если Не ОбщиеНастройки.Свойство("ОтображатьВсеВариантыОтчетов") Тогда
			ОбщиеНастройки.Вставить("ОтображатьВсеВариантыОтчетов", Ложь);
		КонецЕсли;
	КонецЕсли;
	Возврат ОбщиеНастройки;
КонецФункции

// Глобальные настройки панели отчетов.
Функция СохранитьОбщиеНастройкиПанели(ОбщиеНастройки) Экспорт
	Если ТипЗнч(ОбщиеНастройки) <> Тип("Структура") Тогда
		Возврат Неопределено;
	КонецЕсли;
	ОбщегоНазначения.ХранилищеОбщихНастроекСохранить(
		ВариантыОтчетовКлиентСервер.ПолноеИмяПодсистемы(),
		"ПанельОтчетов",
		ОбщиеНастройки);
	Возврат ОбщиеНастройки;
КонецФункции

// Возвращаемое значение:
//  Структура:
//   * ВыполнятьЗамеры - Булево
//
Функция ПараметрыКлиента() Экспорт
	ПараметрыКлиента = Новый Структура;
	ПараметрыКлиента.Вставить("ВыполнятьЗамеры", ВыполнятьЗамеры());
	
	Возврат ПараметрыКлиента;
КонецФункции

Функция ВыполнятьЗамеры()
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОценкаПроизводительности") Тогда
		Возврат Истина;
	КонецЕсли;
	
	Возврат Ложь;
КонецФункции

// Заполняет наименование варианта отчета, если оно было очищено при применении настроек.
//
// Параметры:
//  СвойстваВариантовОтчетов - см. КоллекцияПредопределенныхВариантовОтчетов.
//  КэшСвойствВариантовОтчетов - ТаблицаЗначений - копия таблицы СвойстваВариантовОтчетов - до применения настроек, где:
//      * Наименование - Строка - наименование варианта отчета до применения настроек.
//      * Отчет - СправочникСсылка.ИдентификаторыОбъектовРасширений
//              - СправочникСсылка.ДополнительныеОтчетыИОбработки
//              - СправочникСсылка.ИдентификаторыОбъектовМетаданных
//              - Строка - ссылка на идентификатор метаданных отчета.
//
Процедура ЗаполнитьОчищенныеНаименования(СвойстваВариантовОтчетов, КэшСвойствВариантовОтчетов)
	НайденныеСвойства = СвойстваВариантовОтчетов.НайтиСтроки(Новый Структура("Наименование", "")); // см. КоллекцияПредопределенныхВариантовОтчетов
	Если НайденныеСвойства.Количество() = 0 Тогда 
		Возврат;
	КонецЕсли;
	
	КэшСвойствВариантовОтчетов.Свернуть("Отчет, Наименование");
	КэшСвойствВариантовОтчетов.Индексы.Добавить("Отчет");
	
	Для Каждого Свойства Из НайденныеСвойства Цикл 
		
		КэшированныеСвойства = КэшСвойствВариантовОтчетов.Найти(Свойства.Отчет, "Отчет");
		
		Если КэшированныеСвойства <> Неопределено
			И ЗначениеЗаполнено(КэшированныеСвойства.Наименование) Тогда 
			
			Свойства.Наименование = КэшированныеСвойства.Наименование;
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры

// Для выполнения в длительной операции.
//
// Параметры:
//  ОтчетОбъект - ОтчетОбъект
//  Параметры   - см. ПараметрыФормированияОтчета
//
Процедура ЗаполнитьДвоичныеДанныеВнешнегоОтчета(ОтчетОбъект, Параметры)
	
	Если Не ЗначениеЗаполнено(Параметры.ДвоичныеДанныеВнешнегоОтчета) Тогда
		Возврат;
	КонецЕсли;
	
	ДвоичныеДанныеСтруктура = Новый Структура;
	ДвоичныеДанныеСтруктура.Вставить("ДвоичныеДанныеВнешнегоОтчета", Параметры.ДвоичныеДанныеВнешнегоОтчета);
	ЗаполнитьЗначенияСвойств(ОтчетОбъект, ДвоичныеДанныеСтруктура);
	
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// Журнал регистрации

// Запись в журнал регистрации.
Процедура ЗаписатьВЖурнал(Уровень, Сообщение, ВариантОтчета = Неопределено) Экспорт
	Если ТипЗнч(ВариантОтчета) = Тип("ОбъектМетаданных") Тогда
		ОбъектМетаданных = ВариантОтчета;
		Данные = ОбъектМетаданных.Представление();
	Иначе
		ОбъектМетаданных = Метаданные.Справочники.ВариантыОтчетов;
		Данные = ВариантОтчета;
	КонецЕсли;
	ЗаписьЖурналаРегистрации(НаименованиеПодсистемы(Неопределено),
		Уровень, ОбъектМетаданных, Данные, Сообщение);
КонецПроцедуры

// Записывает в журнал регистрации событие запуска процедуры.
Процедура ЗаписатьВЖурналЗапускПроцедуры(ИмяПроцедуры)
	
	ЖурналРегистрации.ДобавитьСообщениеДляЖурналаРегистрации(НаименованиеПодсистемы(Неопределено),
		УровеньЖурналаРегистрации.Информация,,,
		СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Запуск процедуры ""%1"".'"), ИмяПроцедуры)); 
		
КонецПроцедуры

// Записывает в журнал регистрации событие завершения процедуры.
Процедура ЗаписатьВЖурналЗавершениеПроцедуры(ИмяПроцедуры, ИзмененоОбъектов = Неопределено)
	
	Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Завершение процедуры ""%1"".'"), ИмяПроцедуры);
	Если ИзмененоОбъектов <> Неопределено Тогда
		Текст = Текст + " " 
			+ СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Изменено %1 объектов.'"), ИзмененоОбъектов);
	КонецЕсли;
	ЖурналРегистрации.ДобавитьСообщениеДляЖурналаРегистрации(НаименованиеПодсистемы(Неопределено),
		УровеньЖурналаРегистрации.Информация, , , Текст);
	
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// Обработчики стандартных событий.

// Удаление личных вариантов отчетов при удалении пользователя.
Процедура ПриУдаленииПользователя(ПользовательОбъект, Отказ) Экспорт
	Если ПользовательОбъект.ЭтоНовый()
		Или ПользовательОбъект.ОбменДанными.Загрузка
		Или Отказ
		Или Не ПользовательОбъект.ПометкаУдаления Тогда
		Возврат;
	КонецЕсли;
	
	// Установить пометку удаления личных вариантов пользователя.
	ТекстЗапроса =
	"ВЫБРАТЬ
	|	ВариантыОтчетов.Ссылка
	|ИЗ
	|	Справочник.ВариантыОтчетов КАК ВариантыОтчетов
	|ГДЕ
	|	ВариантыОтчетов.Автор = &ПользовательСсылка
	|	И ВариантыОтчетов.ПометкаУдаления = ЛОЖЬ
	|	И ВариантыОтчетов.ТолькоДляАвтора = ИСТИНА";
	
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("ПользовательСсылка", ПользовательОбъект.Ссылка);
	Запрос.Текст = ТекстЗапроса;
	
	Выборка = Запрос.Выполнить().Выбрать();
	Пока Выборка.Следующий() Цикл
		ВариантОбъект = Выборка.Ссылка.ПолучитьОбъект();
		ВариантОбъект.ДополнительныеСвойства.Вставить("ИндексироватьСхему", Ложь);
		ВариантОбъект.УстановитьПометкуУдаления(Истина);
	КонецЦикла;
КонецПроцедуры

// Удаление ссылок подсистем перед их удалением.
Процедура ПередУдалениемИдентификатораОбъектаМетаданных(ИдентификаторОбъектаМетаданныхОбъект, Отказ) Экспорт
	Если ИдентификаторОбъектаМетаданныхОбъект.ОбменДанными.Загрузка Тогда
		Возврат;
	КонецЕсли;
	
	Подсистема = ИдентификаторОбъектаМетаданныхОбъект.Ссылка;
	
	ТекстЗапроса =
	"ВЫБРАТЬ РАЗЛИЧНЫЕ
	|	ВариантыОтчетов.Ссылка
	|ИЗ
	|	Справочник.ВариантыОтчетов КАК ВариантыОтчетов
	|ГДЕ
	|	ВариантыОтчетов.Размещение.Подсистема = &Подсистема";
	
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("Подсистема", Подсистема);
	Запрос.Текст = ТекстЗапроса;
	
	ИзменяемыеВарианты = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");
	
	НачатьТранзакцию();
	Попытка
		Блокировка = Новый БлокировкаДанных;
		Для Каждого СсылкаВарианта Из ИзменяемыеВарианты Цикл
			ЭлементБлокировки = Блокировка.Добавить(Метаданные.Справочники.ВариантыОтчетов.ПолноеИмя());
			ЭлементБлокировки.УстановитьЗначение("Ссылка", СсылкаВарианта);
		КонецЦикла;
		Блокировка.Заблокировать();
		
		Для Каждого СсылкаВарианта Из ИзменяемыеВарианты Цикл
			ВариантОбъект = СсылкаВарианта.ПолучитьОбъект(); // СправочникОбъект.ВариантыОтчетов
			
			Найденные = ВариантОбъект.Размещение.НайтиСтроки(Новый Структура("Подсистема", Подсистема));
			Для Каждого СтрокаТаблицы Из Найденные Цикл
				ВариантОбъект.Размещение.Удалить(СтрокаТаблицы);
			КонецЦикла;
			
			ВариантОбъект.Записать();
		КонецЦикла;
		ЗафиксироватьТранзакцию();
	Исключение
		ОтменитьТранзакцию();
		ВызватьИсключение;
	КонецПопытки;
	
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// Обновление информационной базы.

// [*] Актуализирует кэш метаданных конфигурации: справочник ПредопределенныеВариантыОтчетов
//     и параметры вариантов отчетов в регистре.
//
Процедура ОперативноеОбновлениеОбщихДанныхКонфигурации(ПараметрыОбновления) Экспорт
	
	Режим = "ОбщиеДанныеКонфигурации";
	НачатьЗаполнениеПредставлений(Режим, Истина);
	ОперативноеОбновлениеОбщихДанных(Режим, ПараметрыОбновления.РазделенныеОбработчики);
	
	ЗапланироватьЗаполнениеПредставлений();
	
КонецПроцедуры

// [*] Актуализирует данные справочника ВариантыОтчетов в части отчетов конфигурации.
Процедура ОперативноеОбновлениеРазделенныхДанныхКонфигурации() Экспорт
	
	АктуализироватьВариантыОтчетов("РазделенныеДанныеКонфигурации");
	
КонецПроцедуры

// [*] Актуализирует данные служебного пользователя для обновления представлений.
Процедура ОперативноеОбновлениеСлужебногоПользователя() Экспорт 
	
	УстановитьПривилегированныйРежим(Истина);
	
	ИмяПользователя = ИмяСлужебногоПользователя();
	ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоИмени(ИмяПользователя);
	
	Если ПользовательИБ = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Отбор = Новый Структура("ИдентификаторПользователяИБ", ПользовательИБ.УникальныйИдентификатор);
	Выборка = Справочники.Пользователи.Выбрать(,, Отбор);
	
	Если Не Выборка.Следующий() Тогда 
		Возврат;
	КонецЕсли;
	
	НачатьТранзакцию();
	
	Попытка
		Блокировка = Новый БлокировкаДанных;
		ЭлементБлокировки = Блокировка.Добавить(Метаданные.Справочники.Пользователи.ПолноеИмя());
		ЭлементБлокировки.УстановитьЗначение("Ссылка", Выборка.Ссылка);
		Блокировка.Заблокировать();
		
		Пользователь = Выборка.Ссылка.ПолучитьОбъект();
		ОбновлениеИнформационнойБазы.УдалитьДанные(Пользователь);
		
		ЗафиксироватьТранзакцию();
	Исключение
		ОтменитьТранзакцию();
		
		ЗаписьЖурналаРегистрации(
			НСтр("ru = 'Варианты отчетов.Обновление служебного пользователя'", ОбщегоНазначения.КодОсновногоЯзыка()),
			УровеньЖурналаРегистрации.Ошибка,
			Метаданные.Справочники.Пользователи,,
			ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
		
	КонецПопытки;
	
КонецПроцедуры

Процедура ОбновитьИндексПоискаПредопределенныхВариантовОтчетов(Параметры = Неопределено) Экспорт
	
	Если ОбщегоНазначения.РазделениеВключено()
		И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда 
		
		Возврат;
	КонецЕсли;
	
	ОбновитьИндексПоиска("ОбщиеДанныеКонфигурации", Истина);
	
КонецПроцедуры

Процедура ОбновитьИндексПоискаПользовательскихВариантовОтчетов(Параметры = Неопределено) Экспорт
	
	ОбновитьИндексПоиска("РазделенныеДанныеКонфигурации", Истина);
	
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// Обновление информационной базы / Начальное заполнение и актуализация справочников.

// Актуализирует кэш метаданных конфигурации/подключенных расширений.
Функция ОперативноеОбновлениеОбщихДанных(Режим, РазделенныеОбработчики)
	
	////////////////////////////////////////////////////////////////////////////////
	// Выполняется только для предопределенных вариантов отчетов.
	
	Результат = РезультатОбновленияОбщихДанных(Режим, РазделенныеОбработчики);
	
	АктуализироватьКлючиПредопределенных(Режим, Результат);
	ПометитьУдаленныеПредопределенные(Режим, Результат);
	СформироватьТаблицуФункциональныхОпций(Режим, Результат);
	ПометитьНаУдалениеВариантыУдаленныхОтчетов(Режим, Результат);
	ЗаписатьТаблицуФункциональныхОпций(Режим, Результат);
	ЗафиксироватьТекущуюВерсиюРасширений();
	
	// Обновить разделенные данные в модели сервиса.
	Если Результат.МодельСервиса И Результат.ЕстьВажныеИзменения Тогда
		Обработчики = Результат.РазделенныеОбработчики;
		Если Обработчики = Неопределено Тогда
			Обработчики = ОбновлениеИнформационнойБазы.НоваяТаблицаОбработчиковОбновления();
			Результат.РазделенныеОбработчики = Обработчики;
		КонецЕсли;
		
		Обработчик = Обработчики.Добавить();
		Обработчик.РежимВыполнения = "Оперативно";
		Обработчик.Версия    = "*";
		Обработчик.Процедура = "ВариантыОтчетов.ОперативноеОбновлениеРазделенныхДанныхКонфигурации";
		Обработчик.Приоритет = 70;
	КонецЕсли;
	
	Возврат Результат;
КонецФункции

// Актуализирует данные справочника ВариантыОтчетов.
Функция АктуализироватьВариантыОтчетов(Режим)
	
	Результат = РезультатАктуализацииВариантовОтчетов();
	
	// 1. Актуализировать разделенные варианты отчетов.
	АктуализироватьВариантыОтчетовПоПредопределенным(Режим, Результат);

	// 2. Установить пометку удаления вариантов удаленных отчетов.
	ПометитьНаУдалениеВариантыУдаленныхОтчетов(Режим, Результат);
	
	Возврат Результат;
	
КонецФункции

// Обновление индекса поиска вариантов отчетов.
Функция ОбновитьИндексПоиска(Режим, ИндексироватьСхему)
	НачатьЗаполнениеПредставлений(Режим, Ложь);
	
	ОбщиеДанные = (Режим = "ОбщиеДанныеКонфигурации" Или Режим = "ОбщиеДанныеРасширений");
	Уточнение = НРег(ПредставлениеРежима(Режим)) + ", " + ?(ИндексироватьСхему, НСтр("ru = 'полное'"), НСтр("ru = 'по изменениям'"));
	
	ПредставлениеПроцедуры = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Обновление индекса поиска (%1)'"), Уточнение);
	ЗаписатьВЖурналЗапускПроцедуры(ПредставлениеПроцедуры);
	
	Запрос = Новый Запрос;
	
	Если ОбщиеДанные Тогда
		Поиск = Новый Структура("Отчет, КлючВарианта, ЭтоВариант", , , Истина);
		Если Режим = "ОбщиеДанныеКонфигурации" Тогда
			ПредопределенныеВарианты = ПредопределенныеВариантыОтчетов("Внутренний");
			Запрос.Текст =
			"ВЫБРАТЬ
			|	ПредопределенныеВариантыОтчетов.Ссылка,
			|	ПредопределенныеВариантыОтчетов.Отчет
			|ИЗ
			|	Справочник.ПредопределенныеВариантыОтчетов КАК ПредопределенныеВариантыОтчетов
			|ГДЕ
			|	ПредопределенныеВариантыОтчетов.ПометкаУдаления = ЛОЖЬ";
		ИначеЕсли Режим = "ОбщиеДанныеРасширений" Тогда
			ПредопределенныеВарианты = ПредопределенныеВариантыОтчетов("Расширение");
			Запрос.Текст =
			"ВЫБРАТЬ
			|	ПредопределенныеВариантыОтчетовВерсийРасширений.Вариант КАК Ссылка,
			|	ПредопределенныеВариантыОтчетовВерсийРасширений.Отчет
			|ИЗ
			|	РегистрСведений.ПредопределенныеВариантыОтчетовВерсийРасширений КАК ПредопределенныеВариантыОтчетовВерсийРасширений
			|ГДЕ
			|	ПредопределенныеВариантыОтчетовВерсийРасширений.ВерсияРасширений = &ВерсияРасширений
			|	И ПредопределенныеВариантыОтчетовВерсийРасширений.Вариант <> &ПустаяСсылка";
			Запрос.УстановитьПараметр("ВерсияРасширений", ПараметрыСеанса.ВерсияРасширений);
			Запрос.УстановитьПараметр("ПустаяСсылка", Справочники.ПредопределенныеВариантыОтчетовРасширений.ПустаяСсылка());
		КонецЕсли;
	Иначе
		Запрос.Текст =
		"ВЫБРАТЬ
		|	ВариантыОтчетов.Ссылка,
		|	ВариантыОтчетов.Отчет
		|ИЗ
		|	Справочник.ВариантыОтчетов КАК ВариантыОтчетов
		|ГДЕ
		|	ВариантыОтчетов.Пользовательский
		|	И ВариантыОтчетов.ТипОтчета = &ТипОтчета
		|	И ВариантыОтчетов.Отчет В(&ДоступныеОтчеты)";
		Запрос.УстановитьПараметр("ДоступныеОтчеты", Новый Массив(ВариантыОтчетовПовтИсп.ДоступныеОтчеты(Ложь)));
		Если Режим = "РазделенныеДанныеКонфигурации" Тогда
			Запрос.УстановитьПараметр("ТипОтчета", Перечисления.ТипыОтчетов.Внутренний);
		ИначеЕсли Режим = "РазделенныеДанныеРасширений" Тогда
			Запрос.УстановитьПараметр("ТипОтчета", Перечисления.ТипыОтчетов.Расширение);
		КонецЕсли;
	КонецЕсли;
	
	ПроблемныеОтчеты = Новый Соответствие;
	НовыеСведения = Новый Соответствие;
	СтарыеСведения = Новый Структура("ХешНастроек, НаименованияПолей, НаименованияПараметровИОтборов, КлючевыеСлова");
	
	СписокОшибок = Новый Массив;
	
	Выборка = Запрос.Выполнить().Выбрать();
	Пока Выборка.Следующий() Цикл
		
		Если ПроблемныеОтчеты[Выборка.Отчет] = Истина Тогда
			Продолжить; // Отчет не подключен, ошибка зарегистрирована ранее.
		КонецЕсли;
		
		НачатьТранзакцию();
		Попытка
			Блокировка = Новый БлокировкаДанных;
			ЭлементБлокировки = Блокировка.Добавить(Выборка.Ссылка.Метаданные().ПолноеИмя());
			ЭлементБлокировки.УстановитьЗначение("Ссылка", Выборка.Ссылка);
			Блокировка.Заблокировать();
			
			ВариантОбъект = Выборка.Ссылка.ПолучитьОбъект(); // СправочникОбъект.ВариантыОтчетов, СправочникОбъект.ПредопределенныеВариантыОтчетов, СправочникОбъект.ПредопределенныеВариантыОтчетовРасширений
			Если ВариантОбъект = Неопределено Тогда
				ОтменитьТранзакцию();
				Продолжить;
			КонецЕсли;
			
			СведенияОбОтчете = НовыеСведения[Выборка.Отчет];
			Если СведенияОбОтчете = Неопределено Тогда
				СведенияОбОтчете = Новый Структура("НастройкиКД, НастройкиДляПоиска, ОтчетОбъект, ИндексироватьСхему");
				НовыеСведения[Выборка.Отчет] = СведенияОбОтчете;
			КонецЕсли;	
			
			Если ОбщиеДанные Тогда
				ЗаполнитьЗначенияСвойств(Поиск, ВариантОбъект, "Отчет, КлючВарианта");
				Найденные = ПредопределенныеВарианты.НайтиСтроки(Поиск);
				Если Найденные.Количество() = 0 Тогда
					ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
						НСтр("ru = 'Вариант ""%1"" не существует для отчета ""%2""'"), 
						ВариантОбъект.КлючВарианта, ВариантОбъект.Отчет);
					ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Ошибка, ТекстОшибки, ВариантОбъект.Ссылка);
					ОтменитьТранзакцию();
					Продолжить; // Возникла проблема.
				КонецЕсли;
				
				ОписаниеВарианта = Найденные[0]; // см. ОписаниеОтчетаПоУмолчанию
				ЗаполнитьОписаниеСтрокиВарианта(ОписаниеВарианта, ПредопределенныеВарианты.НайтиСтроки(
					Новый Структура("Отчет,ЭтоВариант", ВариантОбъект.Отчет, Ложь))[0]);
				
				// Если вариант отключен, то и в поиске он не участвует.
				Если Не ОписаниеВарианта.Включен Тогда
					ОтменитьТранзакцию();
					Продолжить; // Заполнение не требуется.
				КонецЕсли;
				
				СведенияОбОтчете.НастройкиКД = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ОписаниеВарианта.СистемнаяИнформация, "НастройкиКД");
				СведенияОбОтчете.НастройкиДляПоиска = ОписаниеВарианта.НастройкиДляПоиска;
			КонецЕсли;
			
			ЗаполнитьЗначенияСвойств(СтарыеСведения, ПоляДляПоиска(ВариантОбъект));
			СтарыеСведения.ХешНастроек = ВариантОбъект.ХешНастроек;
			СведенияОбОтчете.ИндексироватьСхему = ИндексироватьСхему; // Переиндексировать принудительно, без проверки хеш-суммы.
			
			Попытка
				СхемаПроиндексирована = ЗаполнитьПоляДляПоиска(ВариантОбъект, СведенияОбОтчете);
			Исключение
				ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					НСтр("ru = 'Не удалось перестроить индекс поиска для варианта ""%1"" отчета ""%2"". Возможно, отчет неисправен.'"), 
					ВариантОбъект.КлючВарианта, ВариантОбъект.Отчет);
				ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Ошибка, ТекстОшибки + Символы.ПС 
					+ ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ВариантОбъект.Ссылка);
				СписокОшибок.Добавить(ТекстОшибки);
				ОтменитьТранзакцию();
				Продолжить;
			КонецПопытки;
			
			Если СхемаПроиндексирована И ИзменилисьНастройкиПоиска(ВариантОбъект, СтарыеСведения) Тогда
				Если ОбщиеДанные Тогда
					ЗаписатьПредопределенный(ВариантОбъект);
				Иначе
					ОбновлениеИнформационнойБазы.ЗаписатьОбъект(ВариантОбъект);
				КонецЕсли;
			КонецЕсли;
			
			Если СведенияОбОтчете.ОтчетОбъект = Неопределено Тогда
				ПроблемныеОтчеты[Выборка.Отчет] = Истина; // Отчет не был подключен
			КонецЕсли;
			
			ЗафиксироватьТранзакцию();
		Исключение
			ОтменитьТранзакцию();
			ВызватьИсключение;
		КонецПопытки;	
	КонецЦикла;
	УстановитьПризнакЗаполненияПредставлений(Истина, Ложь, Режим);
	
	ЗаписатьВЖурналЗавершениеПроцедуры(ПредставлениеПроцедуры);
	
	Возврат Неопределено;
КонецФункции

// Замена старых ключей вариантов отчетов на актуальные.
Процедура АктуализироватьКлючиПредопределенных(Режим, Результат)
	
	ПредставлениеПроцедуры = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = 'Обновление ключей вариантов отчетов (%1)'"), 
		?(Режим = "ОбщиеДанныеКонфигурации", НСтр("ru = 'метаданные конфигурации'"), НСтр("ru = 'метаданные расширений'")));
	ЗаписатьВЖурналЗапускПроцедуры(ПредставлениеПроцедуры);
	
	// Составить таблицу замен старых ключей вариантов на актуальные.
	Изменения = ИзмененияКлючей();
	
	// Получить ссылки вариантов отчетов для замены ключей,
	// исключив из списка замен те варианты отчетов,
	// актуальные ключи которых уже зарегистрированы,
	// или старые ключи которых уже не заняты.
	ТекстЗапроса =
	"ВЫБРАТЬ
	|	Изменения.Отчет,
	|	Изменения.СтароеИмяВарианта,
	|	Изменения.АктуальноеИмяВарианта
	|ПОМЕСТИТЬ втИзменения
	|ИЗ
	|	&Изменения КАК Изменения
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ РАЗЛИЧНЫЕ
	|	втИзменения.Отчет,
	|	втИзменения.АктуальноеИмяВарианта,
	|	ВариантыОтчетовСтарые.Ссылка
	|ИЗ
	|	втИзменения КАК втИзменения
	|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПредопределенныеВариантыОтчетов КАК ВариантыОтчетовАктуальные
	|		ПО втИзменения.Отчет = ВариантыОтчетовАктуальные.Отчет
	|			И втИзменения.АктуальноеИмяВарианта = ВариантыОтчетовАктуальные.КлючВарианта
	|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПредопределенныеВариантыОтчетов КАК ВариантыОтчетовСтарые
	|		ПО втИзменения.Отчет = ВариантыОтчетовСтарые.Отчет
	|			И втИзменения.СтароеИмяВарианта = ВариантыОтчетовСтарые.КлючВарианта
	|ГДЕ
	|	ВариантыОтчетовАктуальные.Ссылка ЕСТЬ NULL 
	|	И НЕ ВариантыОтчетовСтарые.Ссылка ЕСТЬ NULL ";
	
	Если Режим = "ОбщиеДанныеРасширений" Тогда
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, ".ПредопределенныеВариантыОтчетов", ".ПредопределенныеВариантыОтчетовРасширений");
		ИмяСправочника = "Справочник.ПредопределенныеВариантыОтчетовРасширений";
	Иначе	
		ИмяСправочника = "Справочник.ПредопределенныеВариантыОтчетов";
	КонецЕсли;
	
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("Изменения", Изменения);
	Запрос.Текст = ТекстЗапроса;
	
	// Заменить старые имена вариантов на актуальные.
	Выборка = Запрос.Выполнить().Выбрать();
	Пока Выборка.Следующий() Цикл
		Результат.ЕстьИзменения = Истина;
		Результат.ЕстьВажныеИзменения = Истина;
		
		НачатьТранзакцию();
		Попытка
			Блокировка = Новый БлокировкаДанных;
			ЭлементБлокировки = Блокировка.Добавить(ИмяСправочника);
			ЭлементБлокировки.УстановитьЗначение("Ссылка", Выборка.Ссылка);
			Блокировка.Заблокировать();
			
			ВариантОбъект = Выборка.Ссылка.ПолучитьОбъект();
			ВариантОбъект.КлючВарианта = Выборка.АктуальноеИмяВарианта;
			ЗаписатьПредопределенный(ВариантОбъект);
			
			ЗафиксироватьТранзакцию();
		Исключение
			ОтменитьТранзакцию();
			ВызватьИсключение;
		КонецПопытки;
	КонецЦикла;
	
	ЗаписатьВЖурналЗавершениеПроцедуры(ПредставлениеПроцедуры);
КонецПроцедуры

Процедура ПометитьУдаленныеПредопределенные(Режим, Результат)
	
	ПредставлениеПроцедуры = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = 'Обновление настроек предопределенных (%1)'"), 
		?(Режим = "ОбщиеДанныеКонфигурации", НСтр("ru = 'метаданные конфигурации'"), НСтр("ru = 'метаданные расширений'")));
	ЗаписатьВЖурналЗапускПроцедуры(ПредставлениеПроцедуры);
	
	Если Режим = "ОбщиеДанныеКонфигурации" Тогда
		ТекстЗапроса = "ВЫБРАТЬ * ИЗ Справочник.ПредопределенныеВариантыОтчетов УПОРЯДОЧИТЬ ПО ПометкаУдаления";
		ПустаяСсылка = Справочники.ПредопределенныеВариантыОтчетов.ПустаяСсылка();
		ИмяТаблицы = "Справочник.ПредопределенныеВариантыОтчетов";
	ИначеЕсли Режим = "ОбщиеДанныеРасширений" Тогда
		ТекстЗапроса = "ВЫБРАТЬ * ИЗ Справочник.ПредопределенныеВариантыОтчетовРасширений УПОРЯДОЧИТЬ ПО ПометкаУдаления";
		ПустаяСсылка = Справочники.ПредопределенныеВариантыОтчетовРасширений.ПустаяСсылка();
		ИмяТаблицы = "Справочник.ПредопределенныеВариантыОтчетовРасширений";
	КонецЕсли;
	
	// Сопоставление информации из базы и из метаданных и пометка на удаление устаревших объектов из базы.
	Результат.ВариантыОтчетов.Индексы.Добавить("Отчет, КлючВарианта, НайденВБазеДанных, ЭтоВариант");
	ПоискВарианта = Новый Структура("Отчет, КлючВарианта, НайденВБазеДанных, ЭтоВариант");
	ПоискВарианта.НайденВБазеДанных = Ложь;
	ПоискВарианта.ЭтоВариант        = Истина;
	
	Запрос = Новый Запрос(ТекстЗапроса);
	ПредопределенныеВариантыОтчетов = Запрос.Выполнить().Выгрузить();
	
	Для Каждого ВариантИзБазы Из ПредопределенныеВариантыОтчетов Цикл
		
		ЗаполнитьЗначенияСвойств(ПоискВарианта, ВариантИзБазы, "Отчет, КлючВарианта");
		Найденные = Результат.ВариантыОтчетов.НайтиСтроки(ПоискВарианта);
		Если Найденные.Количество() > 0 Тогда
			ОписаниеВарианта = Найденные[0];
			ОписаниеОтчета = Результат.ВариантыОтчетов.НайтиСтроки(Новый Структура("Отчет, ЭтоВариант", ВариантИзБазы.Отчет, Ложь))[0];
			ЗаполнитьОписаниеСтрокиВарианта(ОписаниеВарианта, ОписаниеОтчета);
			ОписаниеВарианта.НайденВБазеДанных = Истина;
			ОписаниеВарианта.ВариантИзБазы = ВариантИзБазы;
			Продолжить;
		КонецЕсли;
		
		Если ВариантИзБазы.ПометкаУдаления И ВариантИзБазы.Родитель = ПустаяСсылка Тогда
			Продолжить; // Действие не требуется.
		КонецЕсли;
		
		НачатьТранзакцию();
		Попытка
			Блокировка = Новый БлокировкаДанных;
			ЭлементБлокировки = Блокировка.Добавить(ИмяТаблицы);
			ЭлементБлокировки.УстановитьЗначение("Ссылка", ВариантИзБазы.Ссылка);
			Блокировка.Заблокировать();
			
			ВариантОбъект = ВариантИзБазы.Ссылка.ПолучитьОбъект();
			Если ВариантОбъект = Неопределено Тогда
				ОтменитьТранзакцию();
				Продолжить;
			КонецЕсли;
				
			ВариантОбъект.ПометкаУдаления = Истина;
			ВариантОбъект.Родитель = ПустаяСсылка;
			ЗаписатьПредопределенный(ВариантОбъект);
			
			ЗафиксироватьТранзакцию();
		Исключение
			ОтменитьТранзакцию();
			ВызватьИсключение;
		КонецПопытки;
		
		Результат.ЕстьИзменения = Истина;
		Результат.ЕстьВажныеИзменения = Истина;
		
	КонецЦикла;
	
	ЗаписатьВЖурналЗавершениеПроцедуры(ПредставлениеПроцедуры);
КонецПроцедуры

Процедура СформироватьТаблицуФункциональныхОпций(Режим, Результат)
	
	РеквизитыВариантов = Метаданные.Справочники.ВариантыОтчетов.Реквизиты;
	
	Если Режим = "ОбщиеДанныеКонфигурации" Тогда
		ПустаяСсылка = Справочники.ПредопределенныеВариантыОтчетов.ПустаяСсылка();
	ИначеЕсли Режим = "ОбщиеДанныеРасширений" Тогда
		ПустаяСсылка = Справочники.ПредопределенныеВариантыОтчетовРасширений.ПустаяСсылка();
	КонецЕсли;
	
	ТаблицаФункциональныхОпций = Новый ТаблицаЗначений;
	ТаблицаФункциональныхОпций.Колонки.Добавить("Отчет",                   РеквизитыВариантов.Отчет.Тип);
	ТаблицаФункциональныхОпций.Колонки.Добавить("ПредопределенныйВариант", РеквизитыВариантов.ПредопределенныйВариант.Тип);
	ТаблицаФункциональныхОпций.Колонки.Добавить("ИмяФункциональнойОпции",  Новый ОписаниеТипов("Строка"));
	
	Результат.Вставить("ТаблицаФункциональныхОпций", ТаблицаФункциональныхОпций);
	
	ОтчетыСНастройкамиСписок = Новый СписокЗначений;
	Результат.Вставить("ОтчетыСНастройкамиСписок", ОтчетыСНастройкамиСписок);
	
	ОсновныеВарианты = Новый Соответствие;
	Для Каждого ОписаниеВарианта Из Результат.ВариантыОтчетов Цикл
		
		Если Не ОписаниеВарианта.ЭтоВариант Тогда
			Если ОписаниеВарианта.ОпределитьНастройкиФормы Тогда
				ОтчетыСНастройкамиСписок.Добавить(ОписаниеВарианта.Отчет);
			КонецЕсли;
			Продолжить;
		КонецЕсли;
		
		// Установка реквизита ВариантРодитель для связи вариантов отчетов с основными вариантами отчетов.
		ОписаниеОтчета = Результат.ВариантыОтчетов.НайтиСтроки(Новый Структура("Отчет, ЭтоВариант", ОписаниеВарианта.Отчет, Ложь))[0];
		ЗаполнитьОписаниеСтрокиВарианта(ОписаниеВарианта, ОписаниеОтчета);
		Если ПустаяСтрока(ОписаниеОтчета.ОсновнойВариант) Или ОписаниеВарианта.КлючВарианта = ОписаниеОтчета.ОсновнойВариант Тогда
			КлючОсновногоВарианта = ОписаниеВарианта.Отчет.ПолноеИмя + "." + ОписаниеВарианта.КлючВарианта;
			ВариантСсылка = ОсновныеВарианты[КлючОсновногоВарианта];
			Если ВариантСсылка = Неопределено Тогда
				ОписаниеВарианта.ВариантРодитель = ПустаяСсылка;
				ВариантСсылка = ОбновитьПредопределенныйВариантОтчета(Режим, ОписаниеВарианта, Результат); 
				ОсновныеВарианты[КлючОсновногоВарианта] = ВариантСсылка;
			КонецЕсли
		Иначе
			ОсновнойВариант = Результат.ВариантыОтчетов.НайтиСтроки(
				Новый Структура("Отчет, КлючВарианта", ОписаниеВарианта.Отчет, ОписаниеОтчета.ОсновнойВариант))[0];
			КлючОсновногоВарианта = ОсновнойВариант.Отчет.ПолноеИмя + "." + ОсновнойВариант.КлючВарианта;
			ОсновнойВариантСсылка = ОсновныеВарианты[КлючОсновногоВарианта];
			Если ОсновнойВариантСсылка = Неопределено Тогда
				ОсновнойВариант.ВариантРодитель = ПустаяСсылка;
				ОсновнойВариантСсылка = ОбновитьПредопределенныйВариантОтчета(Режим, ОсновнойВариант, Результат); 
				ОсновныеВарианты[КлючОсновногоВарианта] = ОсновнойВариантСсылка;
			КонецЕсли;	
			ОписаниеВарианта.ВариантРодитель = ОсновнойВариантСсылка;
			ВариантСсылка = ОбновитьПредопределенныйВариантОтчета(Режим, ОписаниеВарианта, Результат);
		КонецЕсли;
		
		Для Каждого ИмяФункциональнойОпции Из ОписаниеВарианта.ФункциональныеОпции Цикл
			СвязьСФункциональнойОпцией = ТаблицаФункциональныхОпций.Добавить();
			СвязьСФункциональнойОпцией.Отчет                   = ОписаниеВарианта.Отчет;
			СвязьСФункциональнойОпцией.ПредопределенныйВариант = ВариантСсылка;
			СвязьСФункциональнойОпцией.ИмяФункциональнойОпции  = ИмяФункциональнойОпции;
		КонецЦикла;
		
	КонецЦикла;

КонецПроцедуры

// Записывает настройки варианта в данные справочника.
//
// Параметры:
//   Режим - Строка - вид обновления данных.
//   ОписаниеВарианта - СтрокаТаблицыЗначений - свойства варианта отчета, где:
//       * ВариантИзБазы - СтрокаТаблицыЗначений - свойства основного варианта отчета, где:
//             * Ссылка - СправочникСсылка.ПредопределенныеВариантыОтчетовРасширений
//                      - СправочникСсылка.ПредопределенныеВариантыОтчетов - ссылка на предопределенный вариант отчета.
//       * Наименование - Строка - наименование варианта отчета.
//       * Описание - Строка - краткая справка по варианту отчета.
//   Результат - см. РезультатОбновленияОбщихДанных
//
Функция ОбновитьПредопределенныйВариантОтчета(Режим, ОписаниеВарианта, Результат)
	
	НачатьТранзакцию();
	Попытка
		ВариантИзБазы = ОписаниеВарианта.ВариантИзБазы;
		Если Результат.ОбновлятьЗамеры Тогда
			Ключ = ?(ОписаниеВарианта.НайденВБазеДанных, ВариантИзБазы.КлючЗамеров, "");
			ЗарегистрироватьЗамерыВариантаКОбновлению(Ключ, ОписаниеВарианта.КлючЗамеров, ОписаниеВарианта.Наименование, Результат);
		КонецЕсли;
		Если ОписаниеВарианта.НайденВБазеДанных Тогда
			Если ВариантИзБазы.ПометкаУдаления = Истина // Описание получено => требуется снять пометку удаления
				Или ИзменилисьКлючевыеНастройкиПредопределенного(ОписаниеВарианта, ВариантИзБазы) Тогда
				Результат.ЕстьВажныеИзменения = Истина; // Перезапись ключевых настроек (потребуется обновление разделенных данных).
			ИначеЕсли Не ИзменилисьВторостепенныеНастройкиПредопределенного(ОписаниеВарианта, ВариантИзБазы) Тогда
				ЗафиксироватьТранзакцию();
				Возврат ВариантИзБазы.Ссылка;
			КонецЕсли;
			
			ВариантИзБазы = ОписаниеВарианта.ВариантИзБазы;
			
			Если Режим = "ОбщиеДанныеКонфигурации" Тогда
				ИмяТаблицы = "Справочник.ПредопределенныеВариантыОтчетов";
			ИначеЕсли Режим = "ОбщиеДанныеРасширений" Тогда
				ИмяТаблицы = "Справочник.ПредопределенныеВариантыОтчетовРасширений";
			КонецЕсли;
			Блокировка = Новый БлокировкаДанных;
			ЭлементБлокировки = Блокировка.Добавить(ИмяТаблицы);
			ЭлементБлокировки.УстановитьЗначение("Ссылка", ВариантИзБазы.Ссылка);
			Блокировка.Заблокировать();
			
			ВариантОбъект = ВариантИзБазы.Ссылка.ПолучитьОбъект(); // СправочникОбъект.ПредопределенныеВариантыОтчетов, СправочникОбъект.ПредопределенныеВариантыОтчетовРасширений
			ВариантОбъект.Размещение.Очистить();
			Если ВариантОбъект.ПометкаУдаления Тогда
				ВариантОбъект.ПометкаУдаления = Ложь;
			КонецЕсли;
		Иначе
			Результат.ЕстьВажныеИзменения = Истина; // Регистрация нового (потребуется обновление разделенных данных).
			Если Режим = "ОбщиеДанныеКонфигурации" Тогда
				ВариантОбъект = Справочники.ПредопределенныеВариантыОтчетов.СоздатьЭлемент();
			ИначеЕсли Режим = "ОбщиеДанныеРасширений" Тогда
				ВариантОбъект = Справочники.ПредопределенныеВариантыОтчетовРасширений.СоздатьЭлемент();
			КонецЕсли;
		КонецЕсли;
		
		ЗаполнитьЗначенияСвойств(ВариантОбъект, ОписаниеВарианта, 
			"Отчет, КлючВарианта, Включен, ВидимостьПоУмолчанию, ГруппироватьПоОтчету, Назначение, ПоказыватьВПодменюВариантов");
		ПоляДляПоиска = ПоляДляПоиска(ВариантОбъект);
		
		Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда
			МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер");
			
			Если ОбщегоНазначения.ЭтоОсновнойЯзык() Тогда
				ВариантОбъект.Наименование = ОписаниеВарианта.Наименование;
				ВариантОбъект.Описание     = ОписаниеВарианта.Описание;
			КонецЕсли;
			
			Если МодульМультиязычностьСервер.КодПервогоДополнительногоЯзыкаИнформационнойБазы() = ТекущийЯзык().КодЯзыка Тогда
				ВариантОбъект.НаименованиеЯзык1 = ?(ЗначениеЗаполнено(ОписаниеВарианта.Наименование), ОписаниеВарианта.Наименование,
					ВариантОбъект.Наименование);
				ВариантОбъект.ОписаниеЯзык1     = ?(ЗначениеЗаполнено(ОписаниеВарианта.Описание), ОписаниеВарианта.Описание,
					ВариантОбъект.Описание);
			КонецЕсли;
			
			Если МодульМультиязычностьСервер.КодВторогоДополнительногоЯзыкаИнформационнойБазы() = ТекущийЯзык().КодЯзыка Тогда
				ВариантОбъект.НаименованиеЯзык2 = ?(ЗначениеЗаполнено(ОписаниеВарианта.Наименование), ОписаниеВарианта.Наименование,
					ВариантОбъект.Наименование);
				ВариантОбъект.ОписаниеЯзык2     = ?(ЗначениеЗаполнено(ОписаниеВарианта.Описание), ОписаниеВарианта.Описание,
					ВариантОбъект.Описание);
			КонецЕсли;
		КонецЕсли;
		
		ПоляДляПоиска.Наименование = ОписаниеВарианта.Наименование;
		ПоляДляПоиска.Описание = ОписаниеВарианта.Описание;
		
		УстановитьПоляДляПоиска(ВариантОбъект, ПоляДляПоиска);
		
		ВариантОбъект.Родитель = ОписаниеВарианта.ВариантРодитель;
		
		ИмяПроцедуры = "ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов";
		ИмяПроцедурыМодуляМенеджера = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ОписаниеВарианта.Отчет, "ПолноеИмя");
		Если ТипЗнч(ИмяПроцедурыМодуляМенеджера) = Тип("Строка") Тогда
			ИмяПроцедурыМодуляМенеджера = ИмяПроцедурыМодуляМенеджера + ".НастроитьВариантыОтчета";
		Иначе
			ИмяПроцедурыМодуляМенеджера = "";
		КонецЕсли;
		РазмещениеВарианта = Новый Массив;
		Для Каждого Раздел Из ОписаниеВарианта.Размещение Цикл
			Если Раздел.Ключ = Неопределено Тогда
				ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru= 'Для варианта отчета ""%1"" (%2) 
					|не указана подсистема для размещения. См. процедуры %3, %4.'"), ОписаниеВарианта.Наименование,
					ОписаниеВарианта.КлючВарианта, ИмяПроцедуры, ИмяПроцедурыМодуляМенеджера);
				ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Ошибка, ТекстСообщения);
				Продолжить;
			КонецЕсли;
			ПолноеИмя = ?(ТипЗнч(Раздел.Ключ) = Тип("Строка"), Раздел.Ключ, Раздел.Ключ.ПолноеИмя());
			РазмещениеВарианта.Добавить(ПолноеИмя);
		КонецЦикла;
		ИдентификаторыПодсистем = ОбщегоНазначения.ИдентификаторыОбъектовМетаданных(РазмещениеВарианта);
		Для Каждого РазмещениеОтчета Из ОписаниеВарианта.Размещение Цикл
			Если РазмещениеОтчета.Ключ = Неопределено Тогда 
				Продолжить;
			КонецЕсли;
			СтрокаРазмещения = ВариантОбъект.Размещение.Добавить();
			ПолноеИмя = ?(ТипЗнч(РазмещениеОтчета.Ключ) = Тип("Строка"), РазмещениеОтчета.Ключ, РазмещениеОтчета.Ключ.ПолноеИмя());
			СтрокаРазмещения.Подсистема = ИдентификаторыПодсистем[ПолноеИмя];
			СтрокаРазмещения.Важный  = (НРег(РазмещениеОтчета.Значение) = НРег("Важный"));
			СтрокаРазмещения.СмТакже = (НРег(РазмещениеОтчета.Значение) = НРег("СмТакже"));
		КонецЦикла;
		
		Если Результат.ОбновлятьЗамеры Тогда
			ВариантОбъект.КлючЗамеров = ОписаниеВарианта.КлючЗамеров;
		КонецЕсли;
		
		Результат.ЕстьИзменения = Истина;
		ЗаписатьПредопределенный(ВариантОбъект);
		
		ЗафиксироватьТранзакцию();
	Исключение
		ОтменитьТранзакцию();
		ВызватьИсключение;
	КонецПопытки;
	
	Возврат ВариантОбъект.Ссылка;
КонецФункции

// Определяет, изменились ли ключевые настройки предопределенного варианта отчета.
Функция ИзменилисьКлючевыеНастройкиПредопределенного(ОписаниеВарианта, ВариантИзБазы)
	Возврат (ВариантИзБазы.Наименование <> ОписаниеВарианта.Наименование
		Или ВариантИзБазы.Родитель <> ОписаниеВарианта.ВариантРодитель
		Или ВариантИзБазы.Назначение <> ОписаниеВарианта.Назначение
		Или ВариантИзБазы.ВидимостьПоУмолчанию <> ОписаниеВарианта.ВидимостьПоУмолчанию);
КонецФункции

// Определяет, изменились ли второстепенные настройки предопределенного варианта отчета.
//
// Параметры:
//   ОписаниеВарианта - см. ОписаниеОтчетаПоУмолчанию
//   ВариантИзБазы - см. ОписаниеОтчетаПоУмолчанию
//
Функция ИзменилисьВторостепенныеНастройкиПредопределенного(ОписаниеВарианта, ВариантИзБазы)
	// Шапка
	Если ВариантИзБазы.Включен <> ОписаниеВарианта.Включен
		Или ВариантИзБазы.Описание <> ОписаниеВарианта.Описание
		Или ВариантИзБазы.КлючЗамеров <> ОписаниеВарианта.КлючЗамеров
		Или ВариантИзБазы.ГруппироватьПоОтчету <> ОписаниеВарианта.ГруппироватьПоОтчету
		Или ВариантИзБазы.ПоказыватьВПодменюВариантов <> ОписаниеВарианта.ПоказыватьВПодменюВариантов Тогда
		Возврат Истина;
	КонецЕсли;
	
	// Таблица "Размещение"
	ТаблицаРазмещения = ВариантИзБазы.Размещение;
	Если ТаблицаРазмещения.Количество() <> ОписаниеВарианта.Размещение.Количество() Тогда
		Возврат Истина;
	КонецЕсли;
	
	Для Каждого КлючИЗначение Из ОписаниеВарианта.Размещение Цикл
		Подсистема = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(КлючИЗначение.Ключ);
		Если ТипЗнч(Подсистема) = Тип("Строка") Тогда
			Продолжить;
		КонецЕсли;
		СтрокаРазмещения = ТаблицаРазмещения.Найти(Подсистема, "Подсистема");
		Если СтрокаРазмещения = Неопределено
			Или СтрокаРазмещения.Важный <> (НРег(КлючИЗначение.Значение) = НРег("Важный"))
			Или СтрокаРазмещения.СмТакже <> (НРег(КлючИЗначение.Значение) = НРег("СмТакже")) Тогда
			Возврат Истина;
		КонецЕсли;
	КонецЦикла;
	
	Возврат Ложь;
КонецФункции

// Определяет, изменились ли настройки поиска предопределенного варианта отчета.
Функция ИзменилисьНастройкиПоиска(ВариантИзБазы, СтарыеСведения)
	Возврат ВариантИзБазы.ХешНастроек <> СтарыеСведения.ХешНастроек
		Или ВариантИзБазы.НаименованияПолей <> СтарыеСведения.НаименованияПолей
		Или ВариантИзБазы.НаименованияПараметровИОтборов <> СтарыеСведения.НаименованияПараметровИОтборов
		Или ВариантИзБазы.КлючевыеСлова <> СтарыеСведения.КлючевыеСлова;
КонецФункции

// Приводит разделенные данные в соответствие с неразделенными данными.
Процедура АктуализироватьВариантыОтчетовПоПредопределенным(Режим, Результат)
	
	ПредставлениеПроцедуры = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Обновление вариантов отчетов (%1)'"), 
		НРег(ПредставлениеРежима(Режим)));
	ЗаписатьВЖурналЗапускПроцедуры(ПредставлениеПроцедуры);
	
	// Обновление сведений предопределенных вариантов.
	ТекстЗапроса =
	"ВЫБРАТЬ
	|	ПредопределенныеКонфигурации.Ссылка КАК ПредопределенныйВариант,
	|	ПредопределенныеКонфигурации.Наименование КАК Наименование,
	|	ПредопределенныеКонфигурации.Отчет КАК Отчет,
	|	ПредопределенныеКонфигурации.ГруппироватьПоОтчету КАК ГруппироватьПоОтчету,
	|	ПредопределенныеКонфигурации.КлючВарианта КАК КлючВарианта,
	|	ПредопределенныеКонфигурации.ВидимостьПоУмолчанию КАК ВидимостьПоУмолчанию,
	|	ПредопределенныеКонфигурации.Назначение КАК Назначение,
	|	ПредопределенныеКонфигурации.Родитель КАК Родитель
	|ПОМЕСТИТЬ втПредопределенные
	|ИЗ
	|	Справочник.ПредопределенныеВариантыОтчетов КАК ПредопределенныеКонфигурации
	|ГДЕ
	|	ПредопределенныеКонфигурации.ПометкаУдаления = ЛОЖЬ
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ВариантыОтчетов.Ссылка,
	|	ВариантыОтчетов.ПометкаУдаления,
	|	ВариантыОтчетов.Отчет,
	|	ВариантыОтчетов.ТипОтчета,
	|	ВариантыОтчетов.КлючВарианта,
	|	ВариантыОтчетов.Наименование КАК Наименование,
	|	ВариантыОтчетов.ПредопределенныйВариант,
	|	ВариантыОтчетов.Назначение,
	|	ВариантыОтчетов.Родитель
	|ПОМЕСТИТЬ втВариантыОтчетов
	|ИЗ
	|	Справочник.ВариантыОтчетов КАК ВариантыОтчетов
	|ГДЕ
	|	(ВариантыОтчетов.ТипОтчета = &ТипОтчета
	|		ИЛИ ТИПЗНАЧЕНИЯ(ВариантыОтчетов.Отчет) = &ТипРеквизитаОтчет)
	|	И ВариантыОтчетов.Пользовательский = ЛОЖЬ
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ВЫБОР
	|		КОГДА втПредопределенные.ПредопределенныйВариант ЕСТЬ NULL 
	|			ТОГДА ИСТИНА
	|		ИНАЧЕ ЛОЖЬ
	|	КОНЕЦ КАК УстановитьПометкуУдаления,
	|	ВЫБОР
	|		КОГДА втВариантыОтчетов.Ссылка ЕСТЬ NULL 
	|			ТОГДА ИСТИНА
	|		ИНАЧЕ ЛОЖЬ
	|	КОНЕЦ КАК СоздатьНовый,
	|	втПредопределенные.ПредопределенныйВариант КАК ПредопределенныйВариант,
	|	втПредопределенные.Назначение КАК Назначение,
	|	втПредопределенные.Наименование КАК Наименование,
	|	втПредопределенные.Отчет КАК Отчет,
	|	втПредопределенные.КлючВарианта КАК КлючВарианта,
	|	втПредопределенные.ГруппироватьПоОтчету КАК ГруппироватьПоОтчету,
	|	ВЫБОР
	|		КОГДА втПредопределенные.Родитель = &ПустаяСсылкаВарианта
	|			ТОГДА НЕОПРЕДЕЛЕНО
	|		ИНАЧЕ втПредопределенные.Родитель
	|	КОНЕЦ КАК ПредопределенныйВариантРодитель,
	|	втВариантыОтчетов.Ссылка КАК РеквизитСсылка,
	|	втВариантыОтчетов.Родитель КАК РеквизитРодитель,
	|	втВариантыОтчетов.Отчет КАК РеквизитОтчет,
	|	втВариантыОтчетов.КлючВарианта КАК РеквизитКлючВарианта,
	|	втВариантыОтчетов.Наименование КАК РеквизитНаименование,
	|	втВариантыОтчетов.ПредопределенныйВариант КАК РеквизитПредопределенныйВариант,
	|	втВариантыОтчетов.Назначение КАК РеквизитНазначение,
	|	втВариантыОтчетов.ПометкаУдаления КАК РеквизитПометкаУдаления
	|ИЗ
	|	втВариантыОтчетов КАК втВариантыОтчетов
	|		ПОЛНОЕ СОЕДИНЕНИЕ втПредопределенные КАК втПредопределенные
	|		ПО втВариантыОтчетов.ПредопределенныйВариант = втПредопределенные.ПредопределенныйВариант";
	
	Запрос = Новый Запрос;
	Если Режим = "РазделенныеДанныеКонфигурации" Тогда
		Запрос.УстановитьПараметр("ТипОтчета", Перечисления.ТипыОтчетов.Внутренний);
		Запрос.УстановитьПараметр("ТипРеквизитаОтчет", Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных"));
		Запрос.УстановитьПараметр("ПустаяСсылкаВарианта", Справочники.ПредопределенныеВариантыОтчетов.ПустаяСсылка());
	ИначеЕсли Режим = "РазделенныеДанныеРасширений" Тогда
		Запрос.УстановитьПараметр("ТипОтчета", Перечисления.ТипыОтчетов.Расширение);
		Запрос.УстановитьПараметр("ТипРеквизитаОтчет", Тип("СправочникСсылка.ИдентификаторыОбъектовРасширений"));
		Запрос.УстановитьПараметр("ПустаяСсылкаВарианта", Справочники.ПредопределенныеВариантыОтчетовРасширений.ПустаяСсылка());
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, ".ПредопределенныеВариантыОтчетов", ".ПредопределенныеВариантыОтчетовРасширений");
	КонецЕсли;
	
	ИзменяемыеРеквизиты = Новый Структура("ПометкаУдаления, Родитель,
		|Наименование, Отчет, КлючВарианта, ПредопределенныйВариант, Назначение");
	СоответствиеРеквизитов = Новый Соответствие;
	СоответствиеРеквизитов.Вставить("ПометкаУдаления",         "РеквизитПометкаУдаления");
	СоответствиеРеквизитов.Вставить("Родитель",                "РеквизитРодитель");
	СоответствиеРеквизитов.Вставить("Наименование",            "РеквизитНаименование");
	СоответствиеРеквизитов.Вставить("Отчет",                   "РеквизитОтчет");
	СоответствиеРеквизитов.Вставить("КлючВарианта",            "РеквизитКлючВарианта");
	СоответствиеРеквизитов.Вставить("ПредопределенныйВариант", "РеквизитПредопределенныйВариант");
	СоответствиеРеквизитов.Вставить("Назначение",              "РеквизитНазначение");
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда
		
		МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер");
		СуффиксЯзыка = МодульМультиязычностьСервер.СуффиксТекущегоЯзыка();
		
		Если ЗначениеЗаполнено(СуффиксЯзыка) Тогда
			ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ПредопределенныеКонфигурации.Наименование КАК Наименование,", 
				"ПредопределенныеКонфигурации.Наименование КАК Наименование,
				|ПредопределенныеКонфигурации.НаименованиеЯзык1 КАК НаименованиеЯзык1,
				|ПредопределенныеКонфигурации.НаименованиеЯзык2 КАК НаименованиеЯзык2,");
				
			ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ВариантыОтчетов.Наименование КАК Наименование,", 
				"ВариантыОтчетов.Наименование КАК Наименование,
				|ВариантыОтчетов.НаименованиеЯзык1 КАК НаименованиеЯзык1,
				|ВариантыОтчетов.НаименованиеЯзык2 КАК НаименованиеЯзык2,");
				
			ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "втВариантыОтчетов.Наименование КАК РеквизитНаименование,",
				"втВариантыОтчетов.Наименование КАК РеквизитНаименование,
				|втВариантыОтчетов.НаименованиеЯзык1 КАК РеквизитНаименованиеЯзык1,
				|втВариантыОтчетов.НаименованиеЯзык2 КАК РеквизитНаименованиеЯзык2,");
				
			ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "втПредопределенные.Наименование КАК Наименование,",
				"втПредопределенные.Наименование КАК Наименование,
				|втПредопределенные.НаименованиеЯзык1 КАК НаименованиеЯзык1,
				|втПредопределенные.НаименованиеЯзык2 КАК НаименованиеЯзык2,");
				
			ИзменяемыеРеквизиты.Вставить("НаименованиеЯзык1");
			ИзменяемыеРеквизиты.Вставить("НаименованиеЯзык2");
			СоответствиеРеквизитов.Вставить("НаименованиеЯзык1", "РеквизитНаименованиеЯзык1");
			СоответствиеРеквизитов.Вставить("НаименованиеЯзык2", "РеквизитНаименованиеЯзык2");
			
		КонецЕсли;
	КонецЕсли;
	
	Запрос.Текст = ТекстЗапроса;

	СводнаяТаблицаПредопределенных = Запрос.Выполнить().Выгрузить();
	СводнаяТаблицаПредопределенных.Колонки.Добавить("Обработана", Новый ОписаниеТипов("Булево"));
	СводнаяТаблицаПредопределенных.Колонки.Добавить("Родитель", Новый ОписаниеТипов("СправочникСсылка.ВариантыОтчетов"));
	
	// Обновление основных предопределенных вариантов (без родителя).
	Поиск = Новый Структура("ПредопределенныйВариантРодитель, УстановитьПометкуУдаления", Неопределено, Ложь);
	Найденные = СводнаяТаблицаПредопределенных.НайтиСтроки(Поиск);
	Для Каждого СтрокаТаблицы Из Найденные Цикл
		Если СтрокаТаблицы.Обработана Тогда
			Продолжить;
		КонецЕсли;
		Если Результат.ОбработанныеПредопределенные[СтрокаТаблицы.ПредопределенныйВариант] <> Неопределено Тогда
			СтрокаТаблицы.УстановитьПометкуУдаления = Истина;
		КонецЕсли;
		
		СтрокаТаблицы.Родитель = Результат.ПустаяСсылка;
		ОбновитьРазделенныйПредопределенный(Результат, ИзменяемыеРеквизиты, СтрокаТаблицы, СоответствиеРеквизитов);
		
		Если Не СтрокаТаблицы.УстановитьПометкуУдаления
			И СтрокаТаблицы.ГруппироватьПоОтчету
			И Результат.ПоискРодителей[СтрокаТаблицы.Отчет] = Неопределено Тогда
			Результат.ПоискРодителей[СтрокаТаблицы.Отчет] = СтрокаТаблицы.РеквизитСсылка;
			
			ОсновнойВариант = Результат.ОсновныеВарианты.Добавить();
			ОсновнойВариант.Отчет   = СтрокаТаблицы.Отчет;
			ОсновнойВариант.Вариант = СтрокаТаблицы.РеквизитСсылка;
		КонецЕсли;
	КонецЦикла;
	
	// Обновление всех оставшихся предопределенных вариантов (подчиненных).
	СводнаяТаблицаПредопределенных.Сортировать("УстановитьПометкуУдаления Возр");
	Для Каждого СтрокаТаблицы Из СводнаяТаблицаПредопределенных Цикл
		Если СтрокаТаблицы.Обработана Тогда
			Продолжить;
		КонецЕсли;
		Если Результат.ОбработанныеПредопределенные[СтрокаТаблицы.ПредопределенныйВариант] <> Неопределено Тогда
			СтрокаТаблицы.УстановитьПометкуУдаления = Истина;
		КонецЕсли;
		Если СтрокаТаблицы.УстановитьПометкуУдаления Тогда
			РодительСсылка = Результат.ПустаяСсылка;
		Иначе
			РодительСсылка = Результат.ПоискРодителей[СтрокаТаблицы.Отчет];
		КонецЕсли;
		
		СтрокаТаблицы.Родитель = РодительСсылка;
		ОбновитьРазделенныйПредопределенный(Результат, ИзменяемыеРеквизиты, СтрокаТаблицы, СоответствиеРеквизитов);
	КонецЦикла;
	
	// Обновление родителей пользовательских вариантов.
	ТекстЗапроса = 
	"ВЫБРАТЬ
	|	ОсновныеВариантыОтчетов.Отчет,
	|	ОсновныеВариантыОтчетов.Вариант
	|ПОМЕСТИТЬ втОсновные
	|ИЗ
	|	&ОсновныеВариантыОтчетов КАК ОсновныеВариантыОтчетов
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ВариантыОтчетов.Ссылка,
	|	втОсновные.Вариант КАК Родитель
	|ИЗ
	|	Справочник.ВариантыОтчетов КАК ВариантыОтчетов
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ втОсновные КАК втОсновные
	|		ПО ВариантыОтчетов.Отчет = втОсновные.Отчет
	|			И ВариантыОтчетов.Родитель <> втОсновные.Вариант
	|			И ВариантыОтчетов.Родитель.Родитель <> втОсновные.Вариант
	|			И ВариантыОтчетов.Ссылка <> втОсновные.Вариант
	|ГДЕ
	|	ВариантыОтчетов.Пользовательский 
	|	ИЛИ НЕ ВариантыОтчетов.ПометкаУдаления";
	
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("ОсновныеВариантыОтчетов", Результат.ОсновныеВарианты);
	Запрос.Текст = ТекстЗапроса;
	Выборка = Запрос.Выполнить().Выбрать();
	Пока Выборка.Следующий() Цикл
		Результат.ЕстьИзменения = Истина;
		
		НачатьТранзакцию();
		Попытка
			Блокировка = Новый БлокировкаДанных;
			ЭлементБлокировки = Блокировка.Добавить("Справочник.ВариантыОтчетов");
			ЭлементБлокировки.УстановитьЗначение("Ссылка", Выборка.Ссылка);
			Блокировка.Заблокировать();
			
			ВариантОбъект = Выборка.Ссылка.ПолучитьОбъект();
			ВариантОбъект.Родитель = Выборка.Родитель;
			ОбновлениеИнформационнойБазы.ЗаписатьОбъект(ВариантОбъект);
			
			ЗафиксироватьТранзакцию();
		Исключение
			ОтменитьТранзакцию();
			ВызватьИсключение;
		КонецПопытки;	
	КонецЦикла;
	
	ЗаписатьВЖурналЗавершениеПроцедуры(ПредставлениеПроцедуры);
КонецПроцедуры

// Обновляет предопределенные данные в разделенном режиме.
Процедура ОбновитьРазделенныйПредопределенный(Результат, ИзменяемыеРеквизиты, СтрокаТаблицы, СоответствиеРеквизитов)
	Если СтрокаТаблицы.Обработана Тогда
		Возврат;
	КонецЕсли;
	
	СтрокаТаблицы.Обработана = Истина;
	
	Если СтрокаТаблицы.УстановитьПометкуУдаления Тогда 
		
		Если СтрокаТаблицы.РеквизитРодитель = Результат.ПустаяСсылка 
			И СтрокаТаблицы.РеквизитПометкаУдаления = Истина Тогда
			Возврат; // Уже помечен.
		КонецЕсли;
		
		НачатьТранзакцию();
		Попытка
			Блокировка = Новый БлокировкаДанных;
			ЭлементБлокировки = Блокировка.Добавить("Справочник.ВариантыОтчетов");
			ЭлементБлокировки.УстановитьЗначение("Ссылка", СтрокаТаблицы.РеквизитСсылка);
			Блокировка.Заблокировать();
			
			ВариантОбъект = СтрокаТаблицы.РеквизитСсылка.ПолучитьОбъект();
			ВариантОбъект.Заблокировать();
			
			ВариантОбъект.Родитель = Результат.ПустаяСсылка;
			ВариантОбъект.ПометкаУдаления = Истина;
			ОбновлениеИнформационнойБазы.ЗаписатьОбъект(ВариантОбъект);
			
			ЗафиксироватьТранзакцию();
		Исключение
			ОтменитьТранзакцию();
			ВызватьИсключение;
		КонецПопытки;	
		
		Результат.ЕстьИзменения = Истина;
		Возврат;
	КонецЕсли;
		
	Если СтрокаТаблицы.ГруппироватьПоОтчету И Не ЗначениеЗаполнено(СтрокаТаблицы.ПредопределенныйВариантРодитель) Тогда
		СтрокаТаблицы.Родитель = Результат.ПустаяСсылка;
	КонецЕсли;
	Результат.ОбработанныеПредопределенные[СтрокаТаблицы.ПредопределенныйВариант] = Истина;
	ЗаполнитьЗначенияСвойств(ИзменяемыеРеквизиты, СтрокаТаблицы);
	ИзменяемыеРеквизиты.ПометкаУдаления = Ложь;
	
	Если Не СтрокаТаблицы.СоздатьНовый И СовпадаютЗначенияСвойств(ИзменяемыеРеквизиты, СтрокаТаблицы, СоответствиеРеквизитов) Тогда
		Возврат; // Изменений нет.
	КонецЕсли;
	
	НачатьТранзакцию();
	Попытка
		Если СтрокаТаблицы.СоздатьНовый Тогда // Добавить.
			ВариантОбъект = Справочники.ВариантыОтчетов.СоздатьЭлемент();
			ВариантОбъект.ПредопределенныйВариант = СтрокаТаблицы.ПредопределенныйВариант;
			ВариантОбъект.Пользовательский = Ложь;
		Иначе // Обновить (если есть изменения).
			Блокировка = Новый БлокировкаДанных;
			ЭлементБлокировки = Блокировка.Добавить("Справочник.ВариантыОтчетов");
			ЭлементБлокировки.УстановитьЗначение("Ссылка", СтрокаТаблицы.РеквизитСсылка);
			Блокировка.Заблокировать();
			
			// Перенос пользовательских настроек.
			ЗаменитьКлючиПользовательскихНастроек(ИзменяемыеРеквизиты, СтрокаТаблицы);
			
			ВариантОбъект = СтрокаТаблицы.РеквизитСсылка.ПолучитьОбъект();
		КонецЕсли;
		
		ЗаполнитьЗначенияСвойств(ВариантОбъект, ИзменяемыеРеквизиты);
		
		ТипОтчетаСтрокой = ВариантыОтчетовКлиентСервер.ТипОтчетаСтрокой(Неопределено, ВариантОбъект.Отчет);
		ВариантОбъект.ТипОтчета = Перечисления.ТипыОтчетов[ТипОтчетаСтрокой];
		ОбновлениеИнформационнойБазы.ЗаписатьОбъект(ВариантОбъект);
		
		Если СтрокаТаблицы.СоздатьНовый Тогда
			РегистрыСведений.НастройкиВариантовОтчетов.ЗаписатьНастройкиДоступностиВариантаОтчета(
				ВариантОбъект.Ссылка, СтрокаТаблицы.СоздатьНовый);
		КонецЕсли;
	
		ЗафиксироватьТранзакцию();
	Исключение
		ОтменитьТранзакцию();
		ВызватьИсключение;
	КонецПопытки;
		
	Результат.ЕстьИзменения = Истина;
	Если СтрокаТаблицы.СоздатьНовый Тогда	
		СтрокаТаблицы.РеквизитСсылка = ВариантОбъект.Ссылка;
	КонецЕсли;
	
КонецПроцедуры

// Возвращает Истина, если совпадают значения свойств Структура и Коллекция с префиксом ПрефиксВКоллекции.
Функция СовпадаютЗначенияСвойств(Структура, Коллекция, СоответствиеРеквизитов)
	Для Каждого КлючИЗначение Из Структура Цикл
		Если Коллекция[СоответствиеРеквизитов[КлючИЗначение.Ключ]] <> КлючИЗначение.Значение Тогда
			Возврат Ложь;
		КонецЕсли;
	КонецЦикла;
	Возврат Истина;
КонецФункции

// Установка пометки удаления вариантов удаленных отчетов.
Процедура ПометитьНаУдалениеВариантыУдаленныхОтчетов(Режим, Результат)
	
	ПредставлениеПроцедуры = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = 'Удаление вариантов удаленных отчетов (%1)'"), 
		НРег(ПредставлениеРежима(Режим)));
	ЗаписатьВЖурналЗапускПроцедуры(ПредставлениеПроцедуры);
	
	Запрос = Новый Запрос;
	
	// АПК:1377-выкл Реквизит Отчет состоит из четырех типов и для данного сценария разыменование не критично.
	ТекстЗапроса =
	"ВЫБРАТЬ
	|	ВариантыОтчетов.Ссылка КАК Ссылка
	|ИЗ
	|	Справочник.ВариантыОтчетов КАК ВариантыОтчетов
	|ГДЕ
	|	НЕ ВариантыОтчетов.ПометкаУдаления
	|	И ВариантыОтчетов.ТипОтчета = &ТипОтчета
	|	И ЕСТЬNULL(ВариантыОтчетов.Отчет.ПометкаУдаления, ИСТИНА)";
	// АПК:1377-вкл
	
	ИмяТаблицы = "Справочник.ВариантыОтчетов";
	Если Режим = "ОбщиеДанныеКонфигурации" Тогда
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, ".ВариантыОтчетов", ".ПредопределенныеВариантыОтчетов");
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ВариантыОтчетов.ТипОтчета = &ТипОтчета", "Истина");
		ИмяТаблицы = "Справочник.ПредопределенныеВариантыОтчетов";
	ИначеЕсли Режим = "ОбщиеДанныеРасширений" Тогда
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, ".ВариантыОтчетов", ".ПредопределенныеВариантыОтчетовРасширений");
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ВариантыОтчетов.ТипОтчета = &ТипОтчета", "Истина");
		ИмяТаблицы = "Справочник.ПредопределенныеВариантыОтчетовРасширений";
	ИначеЕсли Режим = "РазделенныеДанныеКонфигурации" Тогда
		Запрос.УстановитьПараметр("ТипОтчета", Перечисления.ТипыОтчетов.Внутренний);
	ИначеЕсли Режим = "РазделенныеДанныеРасширений" Тогда
		Запрос.УстановитьПараметр("ТипОтчета", Перечисления.ТипыОтчетов.Расширение);
	КонецЕсли;
	
	Запрос.Текст = ТекстЗапроса;
	
	СсылкиУдаляемыхВариантов = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");
	Для Каждого ВариантСсылка Из СсылкиУдаляемыхВариантов Цикл
		Результат.ЕстьИзменения = Истина;
		Результат.ЕстьВажныеИзменения = Истина;
		
		НачатьТранзакцию();
		Попытка
			Блокировка = Новый БлокировкаДанных;
			ЭлементБлокировки = Блокировка.Добавить(ИмяТаблицы);
			ЭлементБлокировки.УстановитьЗначение("Ссылка", ВариантСсылка);
			Блокировка.Заблокировать();
			
			ВариантОбъект = ВариантСсылка.ПолучитьОбъект();
			Если ВариантОбъект = Неопределено Тогда
				ОтменитьТранзакцию();
				Продолжить;
			КонецЕсли;
			ВариантОбъект.Заблокировать();
			ВариантОбъект.ПометкаУдаления = Истина;
			ЗаписатьПредопределенный(ВариантОбъект);
			
			ЗафиксироватьТранзакцию();
		Исключение
			ОтменитьТранзакцию();
			ВызватьИсключение;
		КонецПопытки;
	КонецЦикла;
	
	ЗаписатьВЖурналЗавершениеПроцедуры(ПредставлениеПроцедуры);
КонецПроцедуры

// Перенос пользовательских настроек варианта из соответствующего хранилища.
//
// Параметры:
//   СтарыйВариант - Структура - значения реквизитов варианта отчета, где:
//       * Ссылка - СправочникСсылка.ВариантыОтчетов - ссылка на вариант отчета.
//   АктуальныйВариант - СтрокаТаблицыЗначений
//
Процедура ЗаменитьКлючиПользовательскихНастроек(СтарыйВариант, АктуальныйВариант)
	Если СтарыйВариант.КлючВарианта = АктуальныйВариант.КлючВарианта
		Или Не ЗначениеЗаполнено(СтарыйВариант.КлючВарианта)
		Или Не ЗначениеЗаполнено(АктуальныйВариант.КлючВарианта)
		Или ТипЗнч(АктуальныйВариант.Отчет) <> Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных") Тогда
		Возврат;
	КонецЕсли;
	
	ОтчетПолноеИмя = АктуальныйВариант.Отчет.ПолноеИмя;
	СтарыйКлючОбъекта = ОтчетПолноеИмя + "/" + СтарыйВариант.КлючВарианта;
	НовыйКлючОбъекта = ОтчетПолноеИмя + "/" + АктуальныйВариант.КлючВарианта;
	
	Отбор = Новый Структура("КлючОбъекта", СтарыйКлючОбъекта);
	ВыборкаХранилища = ХранилищеПользовательскихНастроекОтчетов.Выбрать(Отбор);
	ОшибокЧтенияПодряд = 0;
	Пока Истина Цикл
		// Чтение настроек из хранилища по старому ключу.
		Попытка
			ЭлементВыборкиПолучен = ВыборкаХранилища.Следующий();
			ОшибокЧтенияПодряд = 0;
		Исключение
			ЭлементВыборкиПолучен = Неопределено;
			ОшибокЧтенияПодряд = ОшибокЧтенияПодряд + 1;
			ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Ошибка,
				НСтр("ru = 'Не удалось прочитать варианты отчетов из стандартного хранилища по причине:'")
					+ Символы.ПС + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),
				СтарыйВариант.Ссылка);
		КонецПопытки;
		
		Если ЭлементВыборкиПолучен = Ложь Тогда
			Прервать;
		ИначеЕсли ЭлементВыборкиПолучен = Неопределено Тогда
			Если ОшибокЧтенияПодряд > 100 Тогда
				Прервать;
			Иначе
				Продолжить;
			КонецЕсли;
		КонецЕсли;
		
		// Чтение описания настроек.
		ОписаниеНастроек = ХранилищеПользовательскихНастроекОтчетов.ПолучитьОписание(
			ВыборкаХранилища.КлючОбъекта,
			ВыборкаХранилища.КлючНастроек,
			ВыборкаХранилища.Пользователь);
		
		// Запись настроек в хранилище по новому ключу.
		ХранилищеПользовательскихНастроекОтчетов.Сохранить(
			НовыйКлючОбъекта,
			ВыборкаХранилища.КлючНастроек,
			ВыборкаХранилища.Настройки,
			ОписаниеНастроек,
			ВыборкаХранилища.Пользователь);
	КонецЦикла;
	
	// Очистка старых настроек хранилища.
	ХранилищеПользовательскихНастроекОтчетов.Удалить(СтарыйКлючОбъекта, Неопределено, Неопределено);
КонецПроцедуры

// Записывает предопределенный объект.
Процедура ЗаписатьПредопределенный(ВариантОбъект)
	ВариантОбъект.ДополнительныеСвойства.Вставить("ЗаполнениеПредопределенных");
	ОбновлениеИнформационнойБазы.ЗаписатьОбъект(ВариантОбъект);
КонецПроцедуры

// Регистрирует изменения в таблице замеров.
//
// Параметры:
//   СтарыйКлюч - Строка - не актуальный ключ замеров.
//   АктуальныйКлюч - Строка - текущий ключ замеров.
//   АктуальноеНаименование - Строка - текущее наименование отчета.
//   Результат - см. РезультатОбновленияОбщихДанных
//
Процедура ЗарегистрироватьЗамерыВариантаКОбновлению(Знач СтарыйКлюч, Знач АктуальныйКлюч, Знач АктуальноеНаименование, Результат)
	Если ПустаяСтрока(СтарыйКлюч) Тогда
		СтарыйКлюч = АктуальныйКлюч;
	КонецЕсли;
	
	ТаблицаЗамеров = Результат.ТаблицаЗамеров; // ТаблицаЗначений
	
	ОбновлениеЗамера = ТаблицаЗамеров.Добавить();
	ОбновлениеЗамера.СтароеИмя     = СтарыйКлюч     + ".Открытие";
	ОбновлениеЗамера.АктуальноеИмя = АктуальныйКлюч + ".Открытие";
	ОбновлениеЗамера.АктуальноеНаименование = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = 'Отчет ""%1"" (открытие)'"), АктуальноеНаименование);
	
	ОбновлениеЗамера = ТаблицаЗамеров.Добавить();
	ОбновлениеЗамера.СтароеИмя     = СтарыйКлюч     + ".Формирование";
	ОбновлениеЗамера.АктуальноеИмя = АктуальныйКлюч + ".Формирование";
	ОбновлениеЗамера.АктуальноеНаименование = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = 'Отчет ""%1"" (формирование)'"), АктуальноеНаименование);
	
	ОбновлениеЗамера = ТаблицаЗамеров.Добавить();
	ОбновлениеЗамера.СтароеИмя     = СтарыйКлюч     + ".Настройки";
	ОбновлениеЗамера.АктуальноеИмя = АктуальныйКлюч + ".Настройки";
	ОбновлениеЗамера.АктуальноеНаименование = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = 'Отчет ""%1"" (настройки)'"), АктуальноеНаименование);
КонецПроцедуры

// Запись параметров вариантов отчетов (кеш метаданных для ускорения работы):
//
// Параметры:
//   Режим - Строка - режим обновления: "ОбщиеДанныеКонфигурации" или "ОбщиеДанныеРасширений"
//   Результат - Структура:
//     * ВариантыОтчетов - см. ПредопределенныеВариантыОтчетов
//     * ЕстьВажныеИзменения - Булево - признак наличия важных изменений в вариантах отчетов.
//     * ЕстьИзменения - Булево - признак наличия изменений в вариантах отчетов.
//     * МодельСервиса - Булево - признак работы в модели сервиса.
//     * ОбновлятьЗамеры - Булево - признак наличия подсистемы ОценкаПроизводительности.
//     * ОбновлятьКонфигурацию - Булево - признак необходимости обновления данных конфигурации.
//     * ОбновлятьРасширения - Булево - признак необходимости обновления данных расширений.
//     * ОтчетыСНастройкамиСписок - СписокЗначений:
//         ** Значение - СправочникСсылка.ИдентификаторыОбъектовМетаданных - отчеты, в модуле объекта которых размещены
//                                                                           процедуры интеграции с общей формой отчета.
//     * РазделенныеОбработчики - Неопределено
//                              - Структура
//     * ТаблицаЗамеров - см. ТаблицаЗамеров
//     * ТаблицаФункциональныхОпций - ТаблицаЗначений - связь функциональных опций и предопределенных вариантов отчетов:
//         ** Отчет - СправочникСсылка.ИдентификаторыОбъектовМетаданных
//         ** ПредопределенныйВариант - СправочникСсылка.ПредопределенныеВариантыОтчетов
//         ** ИмяФункциональнойОпции - Строка
//
Процедура ЗаписатьТаблицуФункциональныхОпций(Режим, Результат)
	Если Режим = "ОбщиеДанныеРасширений" И Не ЗначениеЗаполнено(ПараметрыСеанса.ВерсияРасширений) Тогда
		Возврат; // Обновление не требуется.
	КонецЕсли;
	ПредставлениеПроцедуры = НСтр("ru = 'Запись неразделенного кэша в регистр'");
	ЗаписатьВЖурналЗапускПроцедуры(ПредставлениеПроцедуры);
	
	Результат.ТаблицаФункциональныхОпций.Сортировать("Отчет, ПредопределенныйВариант, ИмяФункциональнойОпции");
	Результат.ОтчетыСНастройкамиСписок.СортироватьПоЗначению();
	
	НовоеЗначение = Новый Структура;
	НовоеЗначение.Вставить("ТаблицаФункциональныхОпций", Результат.ТаблицаФункциональныхОпций);
	НовоеЗначение.Вставить("ОтчетыСНастройками", Результат.ОтчетыСНастройкамиСписок.ВыгрузитьЗначения());
	
	ПолноеИмяПодсистемы = ВариантыОтчетовКлиентСервер.ПолноеИмяПодсистемы();
	
	Если Режим = "ОбщиеДанныеКонфигурации" Тогда
		СтандартныеПодсистемыСервер.УстановитьПараметрРаботыПрограммы(ПолноеИмяПодсистемы, НовоеЗначение);
	ИначеЕсли Режим = "ОбщиеДанныеРасширений" Тогда
		СтандартныеПодсистемыСервер.УстановитьПараметрРаботыРасширения(ПолноеИмяПодсистемы, НовоеЗначение);
	КонецЕсли;
	
	ЗаписатьВЖурналЗавершениеПроцедуры(ПредставлениеПроцедуры);
КонецПроцедуры

// Запись регистра ПредопределенныеВариантыОтчетовВерсийРасширений.
//
// Сохраняемое значение:
//   ХранилищеЗначения (Структура) - Кэшируемые параметры:
//       * ТаблицаФункциональныхОпций - ТаблицаЗначений - Имена опций и предопределенных вариантов отчетов.
//           ** Отчет - СправочникСсылка.ИдентификаторыОбъектовРасширений - Ссылка отчета.
//           ** ПредопределенныйВариант - СправочникСсылка.ПредопределенныеВариантыОтчетовРасширений - Ссылка варианта.
//           ** ИмяФункциональнойОпции - Строка - Имя ФО.
//       * ОтчетыСНастройками - Массив из СправочникСсылка.ИдентификаторыОбъектовРасширений - Отчеты,
//           в модуле объекта которых размещены процедуры тесной интеграции с общей формой отчета.
//
Процедура ЗафиксироватьТекущуюВерсиюРасширений()
	Если Не ЗначениеЗаполнено(ПараметрыСеанса.ВерсияРасширений) Тогда
		Возврат; // Обновление не требуется.
	КонецЕсли;
	
	ПредставлениеПроцедуры = НСтр("ru = 'Запись регистра версий расширений'");
	ЗаписатьВЖурналЗапускПроцедуры(ПредставлениеПроцедуры);
	
	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ
	|	ПредопределенныеРасширений.Ссылка КАК Вариант,
	|	ПредопределенныеРасширений.Отчет,
	|	ПредопределенныеРасширений.КлючВарианта
	|ИЗ
	|	Справочник.ПредопределенныеВариантыОтчетовРасширений КАК ПредопределенныеРасширений
	|ГДЕ
	|	ПредопределенныеРасширений.ПометкаУдаления = ЛОЖЬ";
	
	Таблица = Запрос.Выполнить().Выгрузить();
	Измерения = Новый Структура("ВерсияРасширений", ПараметрыСеанса.ВерсияРасширений);
	Ресурсы = Новый Структура;
	Набор = РегистрыСведений.ПредопределенныеВариантыОтчетовВерсийРасширений.Набор(Таблица, Измерения, Ресурсы, Истина);
	ОбновлениеИнформационнойБазы.ЗаписатьНаборЗаписей(Набор, Истина);
	
	ЗаписатьВЖурналЗавершениеПроцедуры(ПредставлениеПроцедуры);
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// Обновление представлений на других языках.

// Обработчик регламентного задания ЗаполнениеПредставленийПредопределенныхВариантовОтчетов.
Процедура ЗаполнитьПредставленияПредопределенныхВариантовОтчетов(Языки, ИндексТекущегоЯзыка) Экспорт
	
	ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания(
		Метаданные.РегламентныеЗадания.ОбновлениеПредопределенныхВариантовОтчетов);
	
	УстановитьОтключениеБезопасногоРежима(Истина);
	УстановитьПривилегированныйРежим(Истина);
	
	ПараметрыОбновления = ПараметрыОбновленияНастроек();
	ПараметрыОбновления.Отложенное = Истина;
	ПараметрыОбновления.ЗаполнятьПредставления = Ложь;
	
	Обновить(ПараметрыОбновления);
	
	Если ИндексТекущегоЯзыка < Языки.ВГраница() Тогда
		
		ЗапланироватьЗаполнениеПредставлений(Языки, ИндексТекущегоЯзыка + 1);
		Возврат;
		
	КонецЕсли;
	
	МетаданныеЗадания = Метаданные.РегламентныеЗадания.ОбновлениеПредопределенныхВариантовОтчетов;
	Задания = РегламентныеЗаданияСервер.НайтиЗадания(Новый Структура("Метаданные", МетаданныеЗадания));
	
	Для Каждого Задание Из Задания Цикл
		Задание.Удалить();
	КонецЦикла;

КонецПроцедуры

Процедура ЗапланироватьЗаполнениеПредставлений(Знач Языки = Неопределено, Знач ИндексТекущегоЯзыка = 0)
	
	Если ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда
		Возврат;
	КонецЕсли;
	
	Если ОбщегоНазначения.РазделениеВключено() Тогда
		Возврат;
	КонецЕсли;
	
	ПараметрыЗаполнения = ПараметрыЗаполненияПредставленийВариантовОтчетов(Языки, ИндексТекущегоЯзыка);
	Если ПараметрыЗаполнения = Неопределено Тогда 
		Возврат;
	КонецЕсли;
	
	ОтборЗаданий = Новый Структура("Метаданные, Ключ");
	ЗаполнитьЗначенияСвойств(ОтборЗаданий, ПараметрыЗаполнения);
	
	Задания = РегламентныеЗаданияСервер.НайтиЗадания(ОтборЗаданий);
	
	ЗаполнениеПредставлений = ?(Задания.Количество() = 0, Неопределено, Задания[0]);
	Если ЗаполнениеПредставлений = Неопределено Тогда 
		
		ЗаполнениеПредставлений = РегламентныеЗаданияСервер.ДобавитьЗадание(ПараметрыЗаполнения);
		Возврат;
		
	ИначеЕсли ЗаполнениеПредставлений.Использование Тогда 
		Возврат;
	КонецЕсли;
	
	ЗаполнитьЗначенияСвойств(ЗаполнениеПредставлений, ПараметрыЗаполнения);
	ЗаполнениеПредставлений.Записать();
	
КонецПроцедуры

Функция ПараметрыЗаполненияПредставленийВариантовОтчетов(Языки = Неопределено, ИндексТекущегоЯзыка = 0)
	
	Если Языки = Неопределено Тогда
		Языки = ЯзыкиПредставленийВариантовОтчетовДляЗаполнения();
	КонецЕсли;
	
	Если ИндексТекущегоЯзыка > Языки.ВГраница() Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	КодЯзыка = Языки[ИндексТекущегоЯзыка];
	СлужебныйПользователь = СлужебныйПользователь(КодЯзыка);
	
	Если СлужебныйПользователь = Неопределено Тогда 
		Возврат Неопределено;
	КонецЕсли;
	
	МетаданныеЗадания = Метаданные.РегламентныеЗадания.ОбновлениеПредопределенныхВариантовОтчетов;
	КлючЗадания = "ЗаполнениеПредставленийВариантовОтчетовДляЯзыка" + ВРег(КодЯзыка);
	НаименованиеЗадания = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = 'Заполнение представлений предопределенных вариантов отчетов для языка %1'"), КодЯзыка);
	
	ПараметрыЗадания = Новый Массив;
	ПараметрыЗадания.Добавить(Языки);
	ПараметрыЗадания.Добавить(ИндексТекущегоЯзыка);
	
	РасписаниеЗадания = Новый РасписаниеРегламентногоЗадания;
	РасписаниеЗадания.ВремяНачала = ТекущаяДатаСеанса() + 60;
	
	ПараметрыЗаполнения = Новый Структура;
	ПараметрыЗаполнения.Вставить("Метаданные", МетаданныеЗадания);
	ПараметрыЗаполнения.Вставить("ИмяПользователя", СлужебныйПользователь);
	ПараметрыЗаполнения.Вставить("Ключ", КлючЗадания);
	ПараметрыЗаполнения.Вставить("Наименование", НаименованиеЗадания);
	ПараметрыЗаполнения.Вставить("Параметры", ПараметрыЗадания);
	ПараметрыЗаполнения.Вставить("Расписание", РасписаниеЗадания);
	ПараметрыЗаполнения.Вставить("Использование", Истина);
	
	Возврат ПараметрыЗаполнения;
	
КонецФункции

Функция ЯзыкиПредставленийВариантовОтчетовДляЗаполнения()
	
	Языки = Новый Массив;
	
	КодТекущегоЯзыка = ?(ТипЗнч(ТекущийЯзык()) = Тип("Строка"), ТекущийЯзык(), ТекущийЯзык().КодЯзыка);
	
	Исключения = Новый Массив;
	Исключения.Добавить(КодТекущегоЯзыка);
	Исключения.Добавить(ОбщегоНазначения.КодОсновногоЯзыка());
	
	Для Каждого Язык Из Метаданные.Языки Цикл
		
		Если Исключения.Найти(Язык) = Неопределено Тогда
			Языки.Добавить(Язык.КодЯзыка);
		КонецЕсли;
		
	КонецЦикла;
	
	Возврат Языки;
	
КонецФункции

Функция СлужебныйПользователь(Знач КодЯзыка)
	
	ИмяПользователя = ИмяСлужебногоПользователя();
	
	// Обновление пользователя информационной базы.
	ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоИмени(ИмяПользователя);
	
	Если ПользовательИБ = Неопределено Тогда
		Если ПользователиИнформационнойБазы.ПолучитьПользователей().Количество() = 0 Тогда 
			Возврат Неопределено;
		КонецЕсли;
		
		ПользовательИБ = ПользователиИнформационнойБазы.СоздатьПользователя();
		ПользовательИБ.Имя = ИмяПользователя;
		ПользовательИБ.Пароль = Строка(Новый УникальныйИдентификатор);
		ПользовательИБ.ЗапрещеноИзменятьПароль = Истина;
		ПользовательИБ.ПоказыватьВСпискеВыбора = Ложь;
	КонецЕсли;
	
	ПользовательИБ.Язык = ЯзыкПоКоду(КодЯзыка);
	ПользовательИБ.Записать();
	
	// Обновление пользователя - элемента справочника Пользователи.
	ОписаниеПользователяИБ = Новый Структура;
	ОписаниеПользователяИБ.Вставить("Действие", "Записать");
	ОписаниеПользователяИБ.Вставить("Имя", ПользовательИБ.Имя);
	ОписаниеПользователяИБ.Вставить("АутентификацияСтандартная", Истина);
	ОписаниеПользователяИБ.Вставить("ПоказыватьВСпискеВыбора", ПользовательИБ.ПоказыватьВСпискеВыбора);
	ОписаниеПользователяИБ.Вставить("УникальныйИдентификатор", ПользовательИБ.УникальныйИдентификатор);
	
	Отбор = Новый Структура("ИдентификаторПользователяИБ", ПользовательИБ.УникальныйИдентификатор);
	Выборка = Справочники.Пользователи.Выбрать(,, Отбор);
	ЭтоНовый = Не Выборка.Следующий();
	
	НачатьТранзакцию();
	
	Попытка
		Блокировка = Новый БлокировкаДанных;
		ЭлементБлокировки = Блокировка.Добавить(Метаданные.Справочники.Пользователи.ПолноеИмя());
		
		Если Не ЭтоНовый Тогда 
			ЭлементБлокировки.УстановитьЗначение("Ссылка", Выборка.Ссылка);
		КонецЕсли;
		
		Блокировка.Заблокировать();
		
		Если ЭтоНовый Тогда 
			Пользователь = Справочники.Пользователи.СоздатьЭлемент();
		Иначе
			Пользователь = Выборка.Ссылка.ПолучитьОбъект();
		КонецЕсли;
		
		Пользователь.Наименование = ПользовательИБ.Имя;
		Пользователь.Служебный = Истина;
		Пользователь.ДополнительныеСвойства.Вставить("ОписаниеПользователяИБ", ОписаниеПользователяИБ);
		Пользователь.Записать();
		
		ЗафиксироватьТранзакцию();
	Исключение
		ОтменитьТранзакцию();
		
		ЗаписьЖурналаРегистрации(
			НСтр("ru = 'Варианты отчетов.Создание служебного пользователя'", ОбщегоНазначения.КодОсновногоЯзыка()),
			УровеньЖурналаРегистрации.Ошибка,
			Метаданные.Справочники.Пользователи,,
			ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
		
		Возврат Неопределено;
	КонецПопытки;
	
	Возврат ПользовательИБ.Имя;
	
КонецФункции

// Возвращает метаданные по коду языка конфигурации.
//
// Параметры:
//   КодЯзыка - Строка - код языка, например "en" (как задано в свойстве КодЯзыка метаданных ОбъектМетаданных: Язык).
//
// Возвращаемое значение:
//   ОбъектМетаданныхЯзык - если найден по переданному коду языка, иначе Неопределено.
//   
Функция ЯзыкПоКоду(Знач КодЯзыка)
	Для каждого Язык Из Метаданные.Языки Цикл
		Если Язык.КодЯзыка = КодЯзыка Тогда
			Возврат Язык;
		КонецЕсли;
	КонецЦикла;
	Возврат Неопределено;
КонецФункции

Функция ИмяСлужебногоПользователя()
	
	Возврат "СлужебныйПользовательДляОбновленияПредставлений";
	
КонецФункции

Функция ПредставлениеРежима(Режим)
	
	Режимы = Новый Соответствие;
	Режимы.Вставить("ОбщиеДанныеКонфигурации", НСтр("ru = 'Общие данные конфигурации'"));
	Режимы.Вставить("ОбщиеДанныеРасширений", НСтр("ru = 'Общие данные расширений'"));
	Режимы.Вставить("РазделенныеДанныеКонфигурации", НСтр("ru = 'Разделенные данные конфигурации'"));
	Режимы.Вставить("РазделенныеДанныеРасширений", НСтр("ru = 'Разделенные данные расширений'"));
	
	ПредставлениеРежима = Режимы.Получить(Режим);
	
	Возврат ?(ПредставлениеРежима = Неопределено, "", ПредставлениеРежима);
	
КонецФункции

////////////////////////////////////////////////////////////////////////////////
// Работа с деревом подсистем из форм.

// Добавляет элементы условного оформления дерева подсистем.
//
// Параметры:
//   Форма - ФормаКлиентскогоПриложения - форма элемента справочника ВариантыОтчетов,
//           форма сохранения варианта отчета, форма настройки размещения варианта отчета, где:
//       * Элементы - ВсеЭлементыФормы - элементы переданной формы, где:
//             ** ДеревоПодсистем - ТаблицаФормы - перечень доступных разделов конфигурации,
//             ** ДеревоПодсистемВажность - ПолеФормы - поле таблицы формы, для установки степени важности варианта отчета.
//             ** ДеревоПодсистемИспользование - ПолеФормы - признак использования варианта отчета в соответствующем разделе.
//
Процедура УстановитьУсловноеОформлениеДереваПодсистем(Форма) Экспорт
	
	ЭлементыФормы = Форма.Элементы;
	
	ДеревоПодсистем = ЭлементыФормы.ДеревоПодсистем; // ТаблицаФормы
	ПризнакИспользованияОтчета = ЭлементыФормы.ДеревоПодсистемИспользование; // ПолеФормы
	ПолеВажностиОтчета = ЭлементыФормы.ДеревоПодсистемВажность; // ПолеФормы
	
	ВариантыВажностиОтчета = ПолеВажностиОтчета.СписокВыбора; // СписокЗначений
	ВариантыВажностиОтчета.Добавить(ПредставлениеВажный());
	ВариантыВажностиОтчета.Добавить(ПредставлениеСмТакже());
	
	Элемент = Форма.УсловноеОформление.Элементы.Добавить();
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(ДеревоПодсистем.Имя);
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ДеревоПодсистем.Приоритет");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = "";

	Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);
	
	Элемент = Форма.УсловноеОформление.Элементы.Добавить();
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(ПризнакИспользованияОтчета.Имя);
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(ПолеВажностиОтчета.Имя);
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ДеревоПодсистем.Приоритет");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = "";

	Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь);
	
КонецПроцедуры

// Формирует дерево подсистем по данным варианта-основания.
Функция ДеревоПодсистемСформировать(Форма, ВариантОснование) Экспорт
	// Пустое дерево без настроек.
	Прототип = Форма.РеквизитФормыВЗначение("ДеревоПодсистем", Тип("ДеревоЗначений")); // ДеревоЗначений
	ДеревоПодсистем = ВариантыОтчетовПовтИсп.ПодсистемыТекущегоПользователя().Дерево.Скопировать();
	Для Каждого КолонкаПрототипа Из Прототип.Колонки Цикл
		Если ДеревоПодсистем.Колонки.Найти(КолонкаПрототипа.Имя) = Неопределено Тогда
			ДеревоПодсистем.Колонки.Добавить(КолонкаПрототипа.Имя, КолонкаПрототипа.ТипЗначения);
		КонецЕсли;
	КонецЦикла;
	
	// Параметры.
	Контекст = Новый Структура("ДеревоПодсистем");
	Контекст.ДеревоПодсистем = ДеревоПодсистем;
	
	// Размещение, настроенное администратором.
	Подсистемы = Новый Массив;
	Для Каждого СтрокаРазмещения Из ВариантОснование.Размещение Цикл
		Подсистемы.Добавить(СтрокаРазмещения.Подсистема);
		ДеревоПодсистемЗарегистрироватьНастройкиПодсистемы(Контекст, СтрокаРазмещения, СтрокаРазмещения.Использование);
	КонецЦикла;
	
	// Размещение, предопределенное разработчиком.
	ТекстЗапроса = 
	"ВЫБРАТЬ
	|	Размещение.Ссылка,
	|	Размещение.НомерСтроки,
	|	Размещение.Подсистема,
	|	Размещение.Важный,
	|	Размещение.СмТакже
	|ИЗ
	|	Справочник.ПредопределенныеВариантыОтчетов.Размещение КАК Размещение
	|ГДЕ
	|	Размещение.Ссылка = &Ссылка
	|	И НЕ Размещение.Подсистема В (&Подсистемы)";
	
	Если ТипЗнч(ВариантОснование.ПредопределенныйВариант) = Тип("СправочникСсылка.ПредопределенныеВариантыОтчетовРасширений") Тогда
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ПредопределенныеВариантыОтчетов", "ПредопределенныеВариантыОтчетовРасширений");
	КонецЕсли;
	
	Запрос = Новый Запрос(ТекстЗапроса);
	Запрос.УстановитьПараметр("Ссылка", ВариантОснование.ПредопределенныйВариант);
	// Не зачитывать настройки подсистем, переопределенные администратором.
	Запрос.УстановитьПараметр("Подсистемы", Подсистемы);
	РазмещениеПредопределенного = Запрос.Выполнить().Выгрузить();
	Для Каждого СтрокаРазмещения Из РазмещениеПредопределенного Цикл
		ДеревоПодсистемЗарегистрироватьНастройкиПодсистемы(Контекст, СтрокаРазмещения, Истина);
	КонецЦикла;
	
	Возврат Контекст.ДеревоПодсистем;
КонецФункции

// Добавляет подсистему в дерево.
//
// Параметры:
//   Контекст - Структура - свойства настройки размещения отчета, где:
//       * ДеревоПодсистем - ДеревоЗначений - список подсистем, в которых используется отчет, где:
//             ** Важность - Строка - степень важности отчета.
//
Процедура ДеревоПодсистемЗарегистрироватьНастройкиПодсистемы(Контекст, СтрокаРазмещения, Использование)
	Поиск = Новый Структура("Ссылка", СтрокаРазмещения.Подсистема);
	Найденные = Контекст.ДеревоПодсистем.Строки.НайтиСтроки(Поиск, Истина);
	Если Найденные.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;
	
	СтрокаДерева = Найденные[0];
	
	Если СтрокаРазмещения.Важный Тогда
		СтрокаДерева.Важность = ПредставлениеВажный();
	ИначеЕсли СтрокаРазмещения.СмТакже Тогда
		СтрокаДерева.Важность = ПредставлениеСмТакже();
	Иначе
		СтрокаДерева.Важность = "";
	КонецЕсли;
	СтрокаДерева.Использование = Использование;
КонецПроцедуры

// Сохраняет настройки размещения, измененные пользователем в табличную часть варианта отчета.
//
// Параметры:
//   ВариантОбъект - СправочникОбъект.ВариантыОтчетов - объект варианта отчета, где:
//   ИзмененныеПодсистемы - Массив из СтрокаДереваЗначений - строки дерева значений, с измененным размещением, где:
//       * Ссылка - СправочникСсылка.ИдентификаторыОбъектовРасширений
//                - СправочникСсылка.ИдентификаторыОбъектовМетаданных - идентификатор метаданных подсистемы.
//       * Важность - Строка - степень важности отчета для соответствующей подсистемы.
//
Процедура ДеревоПодсистемЗаписать(ВариантОбъект, ИзмененныеПодсистемы) Экспорт
	Для Каждого Подсистема Из ИзмененныеПодсистемы Цикл 
		СтрокаТабличнойЧасти = ВариантОбъект.Размещение.Найти(Подсистема.Ссылка, "Подсистема");
		Если СтрокаТабличнойЧасти = Неопределено Тогда
			// Необходимо зарегистрировать настройку размещения варианта безусловно (даже флажок Использование отключен)
			// - только тогда эта настройка заменит предопределенную (из неразделенного справочника).
			СтрокаТабличнойЧасти = ВариантОбъект.Размещение.Добавить();
			СтрокаТабличнойЧасти.Подсистема = Подсистема.Ссылка;
		КонецЕсли;
		
		Если Подсистема.Использование = 0 Тогда
			СтрокаТабличнойЧасти.Использование = Ложь;
		ИначеЕсли Подсистема.Использование = 1 Тогда
			СтрокаТабличнойЧасти.Использование = Истина;
		Иначе
			// Оставить как есть
		КонецЕсли;
		
		Если Подсистема.Важность = ПредставлениеВажный() Тогда
			СтрокаТабличнойЧасти.Важный  = Истина;
			СтрокаТабличнойЧасти.СмТакже = Ложь;
		ИначеЕсли Подсистема.Важность = ПредставлениеСмТакже() Тогда
			СтрокаТабличнойЧасти.Важный  = Ложь;
			СтрокаТабличнойЧасти.СмТакже = Истина;
		Иначе
			СтрокаТабличнойЧасти.Важный  = Ложь;
			СтрокаТабличнойЧасти.СмТакже = Ложь;
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры

// Представление группы важности.
//
// Возвращаемое значение:
//   Строка - значение степени важности отчета.
//
Функция ПредставлениеСмТакже() Экспорт
	Возврат НСтр("ru = 'См. также'");
КонецФункции 

// Представление группы важности.
//
// Возвращаемое значение:
//   Строка - значение степени важности отчета.
//
Функция ПредставлениеВажный() Экспорт
	Возврат НСтр("ru = 'Важный'");
КонецФункции

// Разделитель, который используется для отображения нескольких наименований в интерфейсе.
Функция РазделительПредставления()
	Возврат ", ";
КонецФункции

// Превращает тип отчета в строковый идентификатор.
Функция ТипОтчета(ОтчетСсылка) Экспорт
	ТипСсылки = ТипЗнч(ОтчетСсылка);
	Если ТипСсылки = Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных") Тогда
		Возврат Перечисления.ТипыОтчетов.Внутренний;
	ИначеЕсли ТипСсылки = Тип("СправочникСсылка.ИдентификаторыОбъектовРасширений") Тогда
		Возврат Перечисления.ТипыОтчетов.Расширение;
	ИначеЕсли ТипСсылки = Тип("Строка") Тогда
		Возврат Перечисления.ТипыОтчетов.Внешний;
	ИначеЕсли ТипСсылки = ТипСсылкиДополнительногоОтчета() Тогда
		Возврат Перечисления.ТипыОтчетов.Дополнительный;
	КонецЕсли;
	Возврат Перечисления.ТипыОтчетов.ПустаяСсылка();
КонецФункции

Функция ТипОтчетаСтрокой(ОтчетСсылка) Экспорт
	ТипСсылки = ТипЗнч(ОтчетСсылка);
	
	Если ТипСсылки = Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных") Тогда
		Возврат "Внутренний";
	ИначеЕсли ТипСсылки = Тип("СправочникСсылка.ИдентификаторыОбъектовРасширений") Тогда
		Возврат "Расширение";
	ИначеЕсли ТипСсылки = Тип("Строка") Тогда
		Возврат "Внешний";
	ИначеЕсли ТипСсылки = ТипСсылкиДополнительногоОтчета() Тогда
		Возврат "Дополнительный";
	КонецЕсли;
	
	Возврат Неопределено;
КонецФункции

// Возвращает тип ссылки дополнительного отчета.
Функция ТипСсылкиДополнительногоОтчета()
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда
		Возврат Тип("СправочникСсылка.ДополнительныеОтчетыИОбработки");
	КонецЕсли;
	
	Возврат Неопределено;
КонецФункции

////////////////////////////////////////////////////////////////////////////////
// Работа со списком варианта отчета.

// Обработчик установки условного оформления списка пользователей варианта отчета.
//
// Параметры:
//  Форма - ФормаКлиентскогоПриложения - форма сохранения варианта отчета, форма элемента справочника варианта отчета, где:
//      * Элементы - ВсеЭлементыФормы - элементы соответствующей формы.
//
Процедура УстановитьУсловноеОформлениеСпискаПользователейВариантаОтчета(Форма) Экспорт 
	
	ЭлементыФормы = Форма.Элементы;
	ПолеЗначенияПользователя = ЭлементыФормы.ПользователиВариантаЗначение; // ПолеФормы
	
	//
	Элемент = Форма.УсловноеОформление.Элементы.Добавить();
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(ПолеЗначенияПользователя.Имя);
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПользователиВарианта.Значение");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено;
	
	Элемент.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru = 'Все пользователи'"));
	
	//
	Элемент = Форма.УсловноеОформление.Элементы.Добавить();
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(ПолеЗначенияПользователя.Имя);
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПользователиВарианта.Представление");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Содержит;
	ОтборЭлемента.ПравоеЗначение = "[ЭтоАвторВариантаОтчета]";
	
	ШрифтВажнойНадписи = Метаданные.ЭлементыСтиля.ВажнаяНадписьШрифт;
	Элемент.Оформление.УстановитьЗначениеПараметра("Шрифт", ШрифтВажнойНадписи.Значение);
	Элемент.Оформление.УстановитьЗначениеПараметра("Текст", Новый ПолеКомпоновкиДанных("ПользователиВарианта.Значение"));
	
КонецПроцедуры

// Обработчик установки свойств списка пользователей, в зависимости от переключателя Доступность.
//
// Параметры:
//  Форма - ФормаКлиентскогоПриложения - форма сохранения варианта отчета, форма элемента справочника варианта отчета, где:
//      * Элементы - ВсеЭлементыФормы - элементы соответствующей формы.
//      * ИспользоватьГруппыПользователей - РеквизитФормы
//                                        - Булево - признак использования в информационной базе
//                                                   справочника ГруппыПользователей.
//      * ИспользоватьВнешнихПользователей - РеквизитФормы
//                                         - Булево - признак использования в информационной базе
//                                                    справочника ГруппыВнешнихПользователей.
//
Процедура ОпределитьПоведениеСпискаПользователейВариантаОтчета(Форма) Экспорт 
	
	Элементы = Форма.Элементы;
	ПодменюПодбора = Элементы.ПользователиВариантаГруппаПодобрать; // ГруппаФормы
	
	ПодборДоступен = Не Элементы.Доступен.ТолькоПросмотр
		И ПравоДоступа("Чтение", Метаданные.Справочники.Пользователи);
	
	ГруппыИспользуются = Форма.ИспользоватьГруппыПользователей Или Форма.ИспользоватьВнешнихПользователей;
	
	Элементы.ПользователиВариантаПометка.Видимость = Не ГруппыИспользуются;
	
	Если Не ПодборДоступен Тогда
		Элементы.ПользователиВарианта.ТолькоПросмотр = Истина;
		ПодменюПодбора.Видимость = Ложь;
		Элементы.ПользователиВариантаПодобратьПользователейГруппы.Видимость = Ложь;
		Элементы.ПользователиВариантаПодобратьГруппыВнешнихПользователей.Видимость = Ложь;
		Элементы.ПользователиВариантаУдалить.Видимость = Ложь;
		Элементы.ПользователиВариантаПодобратьПользователей.Видимость = Ложь;
		Элементы.ПользователиВариантаКонтекстноеМенюУстановитьФлажки.Видимость = Ложь;
		Элементы.ПользователиВариантаКонтекстноеМенюСнятьФлажки.Видимость = Ложь;
		Возврат;
	КонецЕсли;
	
	ПодменюПодбора.Видимость = Форма.ИспользоватьГруппыПользователей И Форма.ИспользоватьВнешнихПользователей;
	Элементы.ПользователиВариантаПодобратьПользователей.Видимость = Не ПодменюПодбора.Видимость;
	
	Элементы.ПользователиВариантаУдалить.Видимость = ГруппыИспользуются;
	Элементы.ПользователиВарианта.ИзменятьСоставСтрок = ГруппыИспользуются И ПодборДоступен;
	
	Элементы.ПользователиВариантаКонтекстноеМенюУстановитьФлажки.Видимость = Не ГруппыИспользуются;
	Элементы.ПользователиВариантаКонтекстноеМенюСнятьФлажки.Видимость = Не ГруппыИспользуются;
	
КонецПроцедуры

// Возвращает ключи пользовательских настроек соответствующего варианта отчета.
//
// Параметры:
//  ВариантОтчета - СправочникСсылка.ВариантыОтчетов - ссылка на вариант отчета.
//  Пользователь - СправочникСсылка.ВнешниеПользователи
//               - СправочникСсылка.Пользователи - ссылка на пользователя настроек.
//  КлючНастройки - Строка
//                - Неопределено - идентификатор пользовательских настроек.
//
// Возвращаемое значение:
//   ТаблицаЗначений, Неопределено - коллекция ключей пользовательских настроек, где:
//       * Наименование - Строка - наименование настроек.
//       * Вариант - СправочникСсылка.ВариантыОтчетов - ссылка на вариант отчета.
//       * Пользователь - СправочникСсылка.ВнешниеПользователи
//                      - СправочникСсылка.Пользователи - ссылка на пользователя настроек.
//       * КлючПользовательскойНастройки - Строка - идентификатор пользовательских настроек.
//
Функция ПользовательскиеНастройкиВариантаОтчета(ВариантОтчета, Знач Пользователь, КлючНастройки = Неопределено)
	
	Если ТипЗнч(ВариантОтчета) <> Тип("СправочникСсылка.ВариантыОтчетов") Тогда 
		Возврат Неопределено;
	КонецЕсли;
	
	Если ТипЗнч(Пользователь) = Тип("Массив") Тогда
		СписокПользователей = Пользователь;
	Иначе
		СписокПользователей = Новый Массив;
		СписокПользователей.Добавить(Пользователь);
	КонецЕсли;
	
	Запрос = Новый Запрос(
	"ВЫБРАТЬ РАЗРЕШЕННЫЕ
	|	Настройки.*
	|ИЗ
	|	Справочник.ПользовательскиеНастройкиОтчетов КАК Настройки
	|ГДЕ
	|	Настройки.Вариант = &ВариантОтчета
	|	И (НЕ &КлючНастройкиОпределен
	|		ИЛИ Настройки.КлючПользовательскойНастройки = &КлючНастройки)
	|	И Настройки.Пользователь В(&Пользователь)
	|
	|УПОРЯДОЧИТЬ ПО
	|	Настройки.ПометкаУдаления");
	
	Запрос.УстановитьПараметр("ВариантОтчета", ВариантОтчета);
	Запрос.УстановитьПараметр("Пользователь", СписокПользователей);
	Запрос.УстановитьПараметр("КлючНастройкиОпределен", КлючНастройки <> Неопределено);
	Запрос.УстановитьПараметр("КлючНастройки", КлючНастройки);
	
	Возврат Запрос.Выполнить().Выгрузить();
	
КонецФункции

Процедура ВывестиПризнакУведомленияПользователейВариантаОтчета(Признак) Экспорт 
	
	Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Обсуждения") Тогда
		Признак.Видимость = Ложь;
		Возврат;
	КонецЕсли;
	
	МодульОбсуждения = ОбщегоНазначения.ОбщийМодуль("Обсуждения");
	Если Не МодульОбсуждения.СистемаВзаимодействийПодключена() Тогда
		Признак.Видимость = Ложь;
	КонецЕсли;
	
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// Формирование представлений полей, параметров и отборов для поиска.

// Вызывается из события ПриЗаписи вариантов.
// Возвращаемое значение:
//   Булево - Истина, если поля для поиска заполнены и требуется записать ВариантОбъект.
//
Функция ЗаполнитьПоляДляПоиска(ВариантОбъект, СведенияОбОтчете = Неопределено) Экспорт
	
	ПоляДляПоиска = ПоляДляПоиска(ВариантОбъект);
	
	ПроверятьХеш = СведенияОбОтчете = Неопределено Или Не СведенияОбОтчете.ИндексироватьСхему;
	Если ПроверятьХеш Тогда
		// Проверка, заполнены ли поля для поиска ранее.
		ЗаполнитьПоля = Лев(ПоляДляПоиска.НаименованияПолей, 1) <> "#";
		ЗаполнитьПараметрыИОтборы = Лев(ПоляДляПоиска.НаименованияПараметровИОтборов, 1) <> "#";
		Если Не ЗаполнитьПоля И Не ЗаполнитьПараметрыИОтборы Тогда
			Возврат Ложь; // Заполнение не требуется.
		КонецЕсли;
	Иначе	
		ЗаполнитьПоля = Истина;
		ЗаполнитьПараметрыИОтборы = Истина;
	КонецЕсли;
	
	// Получение объекта отчета, настроек СКД и варианта.
	ЭтоПредопределенный = ЭтоПредопределенныйВариантОтчета(ВариантОбъект);
	
	// Предустановленные настройки поиска.
	НастройкиДляПоиска = ?(СведенияОбОтчете <> Неопределено, СведенияОбОтчете.НастройкиДляПоиска, Неопределено);
	Если НастройкиДляПоиска <> Неопределено Тогда
		ТребуетсяЗапись = Ложь;
		Если ЗначениеЗаполнено(НастройкиДляПоиска.НаименованияПолей) Тогда
			ПоляДляПоиска.НаименованияПолей = "#" + СокрЛП(НастройкиДляПоиска.НаименованияПолей);
			ЗаполнитьПоля = Ложь;
			ТребуетсяЗапись = Истина;
		КонецЕсли;
		Если ЗначениеЗаполнено(НастройкиДляПоиска.НаименованияПараметровИОтборов) Тогда
			ПоляДляПоиска.НаименованияПараметровИОтборов = "#" + СокрЛП(НастройкиДляПоиска.НаименованияПараметровИОтборов);
			ЗаполнитьПараметрыИОтборы = Ложь;
			ТребуетсяЗапись = Истина;
		КонецЕсли;
		Если ЗначениеЗаполнено(НастройкиДляПоиска.КлючевыеСлова) Тогда
			ПоляДляПоиска.КлючевыеСлова = "#" + СокрЛП(НастройкиДляПоиска.КлючевыеСлова);
			ТребуетсяЗапись = Истина;
		КонецЕсли;
		Если Не ЗаполнитьПоля И Не ЗаполнитьПараметрыИОтборы Тогда
			УстановитьПоляДляПоиска(ВариантОбъект, ПоляДляПоиска);
			Возврат ТребуетсяЗапись; // Заполнение выполнено - объект надо записать.
		КонецЕсли;
	КонецЕсли;
	
	// В некоторых сценариях объект может быть уже закэширован в дополнительных свойствах.
	ОтчетОбъект = ?(СведенияОбОтчете <> Неопределено, СведенияОбОтчете.ОтчетОбъект, Неопределено);
	
	// Когда объект отчета не закэширован - подключение отчета штатным способом.
	Если ОтчетОбъект = Неопределено Тогда
		Подключение = ПодключитьОтчетОбъект(ВариантОбъект.Отчет, Ложь);
		Если Подключение.Успех Тогда
			ОтчетОбъект = Подключение.Объект;
		КонецЕсли;	
		Если СведенияОбОтчете <> Неопределено Тогда
			СведенияОбОтчете.ОтчетОбъект = ОтчетОбъект;
		КонецЕсли;
		Если ОтчетОбъект = Неопределено Тогда
			ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Ошибка, Подключение.ТекстОшибки, ВариантОбъект.Ссылка);
			Возврат Ложь; // Возникла проблема при подключении отчета.
		КонецЕсли;
	КонецЕсли;
	
	// Извлечение текстов макетов возможно только после получения объекта отчета.
	Если НастройкиДляПоиска <> Неопределено И ЗначениеЗаполнено(НастройкиДляПоиска.ИменаМакетов) Тогда
		ПоляДляПоиска.НаименованияПолей = "#" + ИзвлечьТекстМакета(ОтчетОбъект, НастройкиДляПоиска.ИменаМакетов);
		Если Не ЗаполнитьПараметрыИОтборы Тогда
			УстановитьПоляДляПоиска(ВариантОбъект, ПоляДляПоиска);
			Возврат Истина; // Заполнение выполнено - объект надо записать.
		КонецЕсли;
	КонецЕсли;
	
	// Схема компоновки, на основании которой будет выполняться отчет.
	СхемаКД = ОтчетОбъект.СхемаКомпоновкиДанных;
	
	// Если отчет не на СКД, следовательно представления не заполняются или заполняются прикладными механизмами.
	Если СхемаКД = Неопределено Тогда
		ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Для варианта ""%1"" отчета ""%2"" не заполнены настройки поиска:
			|Наименования полей, параметров и отборов.'"),
			ВариантОбъект.КлючВарианта, ВариантОбъект.Отчет);
		Если ЭтоПредопределенный Тогда
			ТекстОшибки = ТекстОшибки + Символы.ПС
				+ СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Подробнее см. процедуру %1.'"),
					"ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов");
		КонецЕсли;
		ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Информация, ТекстОшибки, ВариантОбъект.Ссылка);
		
		Возврат Ложь;
	КонецЕсли;
	
	НастройкиКД = ?(СведенияОбОтчете <> Неопределено, СведенияОбОтчете.НастройкиКД, Неопределено);
	Если ТипЗнч(НастройкиКД) <> Тип("НастройкиКомпоновкиДанных") Тогда
		ВариантНастроекКД = СхемаКД.ВариантыНастроек.Найти(ВариантОбъект.КлючВарианта);
		Если ВариантНастроекКД <> Неопределено Тогда
			НастройкиКД = ВариантНастроекКД.Настройки;
		КонецЕсли;
	КонецЕсли;
	
	// Чтение настроек из данных варианта.
	Если ТипЗнч(НастройкиКД) <> Тип("НастройкиКомпоновкиДанных")
		И ТипЗнч(ВариантОбъект) = Тип("СправочникОбъект.ВариантыОтчетов") Тогда
		Попытка
			НастройкиКД = ВариантОбъект.Настройки.Получить();
		Исключение
			ШаблонСообщения = НСтр("ru = 'Не удалось прочитать настройки пользовательского варианта отчета. 
				|Возможно, в них используются переименованные или удаленные объекты метаданных конфигурации
				| или объектов метаданных отключенных расширений (например, при сообщениях ""Отсутствует отображение для типа"").
				|%1'");
			ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения,
				ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
			ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Ошибка, ТекстСообщения, ВариантОбъект.Ссылка);
			Возврат Ложь; 
		КонецПопытки;
	КонецЕсли;
	
	// Последняя проверка.
	Если ТипЗнч(НастройкиКД) <> Тип("НастройкиКомпоновкиДанных") Тогда
		Если ТипЗнч(ВариантОбъект) = Тип("СправочникОбъект.ПредопределенныеВариантыОтчетов")
			Или ТипЗнч(ВариантОбъект) = Тип("СправочникОбъект.ПредопределенныеВариантыОтчетовРасширений") Тогда
			ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Ошибка, 
				СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					НСтр("ru = 'Не удалось прочитать настройки предопределенного варианта отчета ""%1"".'"), ВариантОбъект.КлючЗамеров),
				ВариантОбъект.Ссылка);
		КонецЕсли;
		Возврат Ложь;
	КонецЕсли;
	
	ХешНовыхНастроек = ОбщегоНазначения.КонтрольнаяСуммаСтрокой(ОбщегоНазначения.ЗначениеВСтрокуXML(НастройкиКД));
	Если ПроверятьХеш И ВариантОбъект.ХешНастроек = ХешНовыхНастроек Тогда
		Возврат Ложь; // Настройки не изменились.
	КонецЕсли;
	ВариантОбъект.ХешНастроек = ХешНовыхНастроек;
	
	ОтчетОбъект.КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКД));
	ОтчетыКлиентСервер.ЗагрузитьНастройки(ОтчетОбъект.КомпоновщикНастроек, НастройкиКД);
	
	Если ЗаполнитьПоля Тогда
		// Преобразование всех настроек автоматической группировки в наборы полей.
		//   См. "АвтоВыбранноеПолеКомпоновкиДанных", "АвтоПолеГруппировкиКомпоновкиДанных",
		//   "АвтоЭлементПорядкаКомпоновкиДанных" в синтакс-помощнике.
		ОтчетОбъект.КомпоновщикНастроек.РазвернутьАвтоПоля();
		ПоляДляПоиска.НаименованияПолей = СформироватьПредставленияПолей(ОтчетОбъект.КомпоновщикНастроек);
	КонецЕсли;
	
	Если ЗаполнитьПараметрыИОтборы Тогда
		ПоляДляПоиска.НаименованияПараметровИОтборов = СформироватьПредставленияПараметровИОтборов(
			ОтчетОбъект.КомпоновщикНастроек);
	КонецЕсли;
	
	УстановитьПоляДляПоиска(ВариантОбъект, ПоляДляПоиска);
	Возврат Истина;
	
КонецФункции

Функция ПоляДляПоиска(ВариантОтчета) 
	
	Результат = Новый Структура;
	Результат.Вставить("НаименованияПолей", "");
	Результат.Вставить("НаименованияПараметровИОтборов", "");
	ЭтоПользовательскийВариантОтчета = (ТипЗнч(ВариантОтчета) = Тип("СправочникОбъект.ВариантыОтчетов"));
	Если Не ЭтоПользовательскийВариантОтчета Тогда
		Результат.Вставить("КлючевыеСлова", "");
		Результат.Вставить("Описание", "");
		Результат.Вставить("Наименование", "");
	КонецЕсли;
	
	// Проверка на подсистему
	Если ОбщегоНазначения.ЭтоОсновнойЯзык() Или ЭтоПользовательскийВариантОтчета Тогда
		ЗаполнитьЗначенияСвойств(Результат, ВариантОтчета);
		Возврат Результат;
	КонецЕсли;
	
	СтрокиХранятсяВТабличнойЧасти = Истина;
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда
		
		МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер");
		СуффиксТекущегоЯзыка = МодульМультиязычностьСервер.СуффиксТекущегоЯзыка();
		
		Если ЗначениеЗаполнено(СуффиксТекущегоЯзыка) Тогда
			Результат.Наименование      = ВариантОтчета["Наименование" + СуффиксТекущегоЯзыка];
			Результат.Описание          = ВариантОтчета["Описание" + СуффиксТекущегоЯзыка];
			Результат.НаименованияПолей = ВариантОтчета["НаименованияПолей" + СуффиксТекущегоЯзыка];
			Результат.КлючевыеСлова     = ВариантОтчета["КлючевыеСлова" + СуффиксТекущегоЯзыка];
			Результат.НаименованияПараметровИОтборов = ВариантОтчета["НаименованияПараметровИОтборов" + СуффиксТекущегоЯзыка];
			СтрокиХранятсяВТабличнойЧасти = Ложь;
		КонецЕсли;
	
	КонецЕсли;
	
	Если СтрокиХранятсяВТабличнойЧасти Тогда
		ПредставленияДляЯзыка = ВариантОтчета.Представления.Найти(ТекущийЯзык().КодЯзыка, "КодЯзыка");
		Если ПредставленияДляЯзыка = Неопределено Тогда
			Возврат Результат;
		КонецЕсли;	
		
		ЗаполнитьЗначенияСвойств(Результат, ПредставленияДляЯзыка);
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

Процедура УстановитьПоляДляПоиска(ВариантОтчета, ПоляДляПоиска)
	
	ЭтоПользовательскийВариантОтчета = (ТипЗнч(ВариантОтчета) = Тип("СправочникОбъект.ВариантыОтчетов"));
	Если ОбщегоНазначения.ЭтоОсновнойЯзык() Или ЭтоПользовательскийВариантОтчета Тогда
		ЗаполнитьЗначенияСвойств(ВариантОтчета, ПоляДляПоиска);
		Возврат;
	КонецЕсли;
	
	ПредставленияДляЯзыка = ВариантОтчета.Представления.Найти(ТекущийЯзык().КодЯзыка, "КодЯзыка");
	Если ПредставленияДляЯзыка = Неопределено Тогда
		ПредставленияДляЯзыка = ВариантОтчета.Представления.Добавить();
	КонецЕсли;
	
	ЗаполнитьЗначенияСвойств(ПредставленияДляЯзыка, ПоляДляПоиска);
	ПредставленияДляЯзыка.КодЯзыка = ТекущийЯзык().КодЯзыка;
	
КонецПроцедуры

Процедура НачатьЗаполнениеПредставлений(Знач Режим, Знач СброситьКеш)
	УстановитьПризнакЗаполненияПредставлений(ТекущаяДатаСеанса(), СброситьКеш, Режим);
КонецПроцедуры

Процедура УстановитьПризнакЗаполненияПредставлений(Знач Значение, Знач СброситьКеш, Знач Режим)
	
	ИмяПараметра = ВариантыОтчетовКлиентСервер.ПолноеИмяПодсистемы() + ".ПредставленияЗаполнены";
	Если Режим = "ОбщиеДанныеКонфигурации" Тогда
		Параметры = СтандартныеПодсистемыСервер.ПараметрРаботыПрограммы(ИмяПараметра);
	Иначе
		Параметры = СтандартныеПодсистемыСервер.ПараметрРаботыРасширения(ИмяПараметра);
	КонецЕсли;
	Если Параметры = Неопределено Тогда
		Параметры = Новый Соответствие;
	ИначеЕсли СброситьКеш Тогда
		Параметры.Очистить();
	КонецЕсли;
	Параметры[ТекущийЯзык().КодЯзыка] = Значение;
	
	Если Режим = "ОбщиеДанныеКонфигурации" Тогда
		СтандартныеПодсистемыСервер.УстановитьПараметрРаботыПрограммы(ИмяПараметра, Параметры);
	Иначе
		СтандартныеПодсистемыСервер.УстановитьПараметрРаботыРасширения(ИмяПараметра, Параметры);
	КонецЕсли;
	
КонецПроцедуры

Функция ПредставленияЗаполнены(Знач Режим = "") Экспорт
	
	ИмяПараметра = ВариантыОтчетовКлиентСервер.ПолноеИмяПодсистемы() + ".ПредставленияЗаполнены";
	Если Режим = "ОбщиеДанныеКонфигурации" Тогда
		Параметры = СтандартныеПодсистемыСервер.ПараметрРаботыПрограммы(ИмяПараметра);
	ИначеЕсли Режим = "РазделенныеДанныеКонфигурации" Тогда
		Параметры = СтандартныеПодсистемыСервер.ПараметрРаботыРасширения(ИмяПараметра);
	Иначе
		РезультатОбщий = ПредставленияЗаполнены("ОбщиеДанныеКонфигурации");
		РезультатРазделенный = ПредставленияЗаполнены("РазделенныеДанныеКонфигурации");
		Если РезультатОбщий = "НеЗаполнены" Или РезультатРазделенный = "НеЗаполнены" Тогда
			Возврат "НеЗаполнены";
		ИначеЕсли РезультатОбщий = "Заполняются" Или РезультатРазделенный = "Заполняются" Тогда
			Возврат "Заполняются";
		КонецЕсли;
		Возврат "Заполнены";
	КонецЕсли;
	Если Параметры = Неопределено Тогда
		Параметры = Новый Соответствие;
	КонецЕсли;
	
	Результат = Параметры[ТекущийЯзык().КодЯзыка];
	Если ТипЗнч(Результат) = Тип("Дата") Тогда
		Возврат ?(ТекущаяДатаСеанса() - Результат < 15 * 60, "Заполняются", "НеЗаполнены"); // таймаут - 15 минут
	КонецЕсли;
	Возврат ?(Результат = Истина, "Заполнены", "НеЗаполнены");
	
КонецФункции	

// Представления группировок и полей из СКД.
//
// Параметры:
//    КомпоновщикНастроекКД - КомпоновщикНастроекКомпоновкиДанных
//
Функция СформироватьПредставленияПолей(КомпоновщикНастроекКД)

	Результат = СтрРазделить(Строка(КомпоновщикНастроекКД.Настройки.Выбор), ",", Ложь);

	Коллекции = Новый Массив;
	Коллекции.Добавить(КомпоновщикНастроекКД.Настройки.Структура);
	Индекс = 0;
	Пока Индекс < Коллекции.Количество() Цикл
		Коллекция = Коллекции[Индекс];
		Индекс = Индекс + 1;
		
		Для Каждого Настройка Из Коллекция Цикл
			
			Если ТипЗнч(Настройка) = Тип("НастройкиВложенногоОбъектаКомпоновкиДанных") Тогда
				Если Не Настройка.Использование Тогда
					Продолжить;
				КонецЕсли;
				Настройка = Настройка.Настройки;
			КонецЕсли;
			
			ОбщегоНазначенияКлиентСервер.ДополнитьМассив(Результат, СтрРазделить(Строка(Настройка.Выбор), ",", Ложь));
			
			Если ТипЗнч(Настройка) = Тип("НастройкиКомпоновкиДанных") Тогда
				Коллекции.Добавить(Настройка.Структура);
			ИначеЕсли ТипЗнч(Настройка) = Тип("ГруппировкаКомпоновкиДанных") Тогда
				Если Не Настройка.Использование Тогда
					Продолжить;
				КонецЕсли;
				Коллекции.Добавить(Настройка.Структура);
			ИначеЕсли ТипЗнч(Настройка) = Тип("ТаблицаКомпоновкиДанных") Тогда
				Если Не Настройка.Использование Тогда
					Продолжить;
				КонецЕсли;
				Коллекции.Добавить(Настройка.Строки);
			ИначеЕсли ТипЗнч(Настройка) = Тип("ГруппировкаТаблицыКомпоновкиДанных") Тогда
				Если Не Настройка.Использование Тогда
					Продолжить;
				КонецЕсли;
				Коллекции.Добавить(Настройка.Структура);
			ИначеЕсли ТипЗнч(Настройка) = Тип("ДиаграммаКомпоновкиДанных") Тогда
				Если Не Настройка.Использование Тогда
					Продолжить;
				КонецЕсли;
				Коллекции.Добавить(Настройка.Серии);
				Коллекции.Добавить(Настройка.Точки);
			ИначеЕсли ТипЗнч(Настройка) = Тип("ГруппировкаДиаграммыКомпоновкиДанных") Тогда
				Если Не Настройка.Использование Тогда
					Продолжить;
				КонецЕсли;
				Коллекции.Добавить(Настройка.Структура);
			КонецЕсли;
			
		КонецЦикла;
		
	КонецЦикла;
	
	Результат = ОбщегоНазначенияКлиентСервер.СвернутьМассив(Результат);
	
	Возврат СтрСоединить(Результат, Символы.ПС);
КонецФункции

// Представления параметров и отборов из СКД.
//
// Параметры:
//   КомпоновщикНастроек - КомпоновщикНастроекКомпоновкиДанных - см. Синтакс-помощник
//
Функция СформироватьПредставленияПараметровИОтборов(КомпоновщикНастроек)
	Результат = Новый Массив;
	
	Настройки = КомпоновщикНастроек.Настройки;
	ПользовательскиеНастройки = КомпоновщикНастроек.ПользовательскиеНастройки;
	
	Режимы = РежимОтображенияЭлементаНастройкиКомпоновкиДанных;
	
	Для Каждого ПользовательскаяНастройка Из ПользовательскиеНастройки.Элементы Цикл
		ТипНастройки = ТипЗнч(ПользовательскаяНастройка);
		Если ТипНастройки = Тип("ЗначениеПараметраНастроекКомпоновкиДанных") Тогда
			ЭтоОтбор = Ложь;
		ИначеЕсли ТипНастройки = Тип("ЭлементОтбораКомпоновкиДанных") Тогда
			ЭтоОтбор = Истина;
		Иначе
			Продолжить;
		КонецЕсли;
		
		Если ПользовательскаяНастройка.РежимОтображения = Режимы.Недоступный Тогда
			Продолжить;
		КонецЕсли;
		
		Идентификатор = ПользовательскаяНастройка.ИдентификаторПользовательскойНастройки;
		
		ОбщаяНастройка = ОтчетыКлиентСервер.ПолучитьОбъектПоПользовательскомуИдентификатору(
			Настройки, Идентификатор,, ПользовательскиеНастройки);
		
		Если ОбщаяНастройка = Неопределено Тогда
			Продолжить;
		КонецЕсли;
		
		Если ПользовательскаяНастройка.РежимОтображения = Режимы.Авто
			И ОбщаяНастройка.РежимОтображения <> Режимы.БыстрыйДоступ Тогда
			Продолжить;
		КонецЕсли;
		
		СтруктураПредставлений = Новый Структура("Представление, ПредставлениеПользовательскойНастройки", "", "");
		ЗаполнитьЗначенияСвойств(СтруктураПредставлений, ОбщаяНастройка);
		Если ЗначениеЗаполнено(СтруктураПредставлений.ПредставлениеПользовательскойНастройки) Тогда
			ЭлементЗаголовок = СтруктураПредставлений.ПредставлениеПользовательскойНастройки;
		ИначеЕсли ЗначениеЗаполнено(СтруктураПредставлений.Представление) Тогда
			ЭлементЗаголовок = СтруктураПредставлений.Представление;
		Иначе
			ДоступнаяНастройка = ОтчетыКлиентСервер.НайтиДоступнуюНастройку(Настройки, ОбщаяНастройка);
			Если ДоступнаяНастройка <> Неопределено И ЗначениеЗаполнено(ДоступнаяНастройка.Заголовок) Тогда
				ЭлементЗаголовок = ДоступнаяНастройка.Заголовок;
			Иначе
				ЭлементЗаголовок = Строка(?(ЭтоОтбор, ОбщаяНастройка.ЛевоеЗначение, ОбщаяНастройка.Параметр));
			КонецЕсли;
		КонецЕсли;
		
		ЭлементЗаголовок = СокрЛП(ЭлементЗаголовок);
		Если ЭлементЗаголовок <> "" Тогда
			Результат.Добавить(ЭлементЗаголовок);
		КонецЕсли;
		
	КонецЦикла;
	
	Результат = ОбщегоНазначенияКлиентСервер.СвернутьМассив(Результат);
	
	Возврат СтрСоединить(Результат, Символы.ПС);
КонецФункции

// Извлекает текстовую информацию из макета.
Функция ИзвлечьТекстМакета(ОтчетОбъект, ИменаМакетов)
	Если ТипЗнч(ИменаМакетов) = Тип("Строка") Тогда
		ИменаМакетов = СтрРазделить(ИменаМакетов, ",", Ложь);
	КонецЕсли;
	ТекстыОбластей = Новый Массив;
	Для Каждого ИмяМакета Из ИменаМакетов Цикл
		Макет = ОтчетОбъект.ПолучитьМакет(СокрЛП(ИмяМакета));
		Если ТипЗнч(Макет) = Тип("ТабличныйДокумент") Тогда
			Низ = Макет.ВысотаТаблицы;
			Право = Макет.ШиринаТаблицы;
			ПроверенныеЯчейки = Новый Соответствие;
			Для НомерКолонки = 1 По Право Цикл
				Для НомерСтроки = 1 По Низ Цикл
					Ячейка = Макет.Область(НомерСтроки, НомерКолонки, НомерСтроки, НомерКолонки);
					Если ПроверенныеЯчейки[Ячейка.Имя] <> Неопределено Тогда
						Продолжить;
					КонецЕсли;
					ПроверенныеЯчейки[Ячейка.Имя] = Истина;
					Если ТипЗнч(Ячейка) <> Тип("ОбластьЯчеекТабличногоДокумента") Тогда
						Продолжить;
					КонецЕсли;
					ТекстОбласти = СокрЛП(Ячейка.Текст);
					Если ПустаяСтрока(ТекстОбласти) Тогда
						Продолжить;
					КонецЕсли;
					
					ТекстыОбластей.Добавить(ТекстОбласти);
					
				КонецЦикла;
			КонецЦикла;
		ИначеЕсли ТипЗнч(Макет) = Тип("ТекстовыйДокумент") Тогда
			ТекстыОбластей.Добавить(СокрЛП(Макет.ПолучитьТекст()));
		КонецЕсли;
	КонецЦикла;
	Возврат СтрСоединить(ТекстыОбластей, Символы.ПС);
КонецФункции

////////////////////////////////////////////////////////////////////////////////
// Уменьшение количества пользовательских настроек.

// Параметры:
//  ОтчетСсылка - СправочникСсылка.ВариантыОтчетов
//  КлючВарианта - Строка
//  ОтчетОбъект - ОтчетОбъект
//
// Возвращаемое значение:
//   Структура - НастройкиОтчета в форме отчета и в форме настроек отчета (хранятся в данных формы):
//       * ВариантСсылка - Неопределено
//                       - СправочникСсылка.ВариантыОтчетов
//       * ПредопределенныйСсылка - Неопределено
//                                - СправочникСсылка.ПредопределенныеВариантыОтчетов
//                                - СправочникСсылка.ПредопределенныеВариантыОтчетовРасширений
//       * КлючПредопределенногоВарианта - Неопределено
//                                       - Строка
//       * Пользовательский - Булево
//       * ТипОтчета - СправочникСсылка.ПредопределенныеВариантыОтчетов,
//                   - СправочникСсылка.ПредопределенныеВариантыОтчетовРасширений
//                   - Неопределено
//       * РазрешеноВыбиратьВарианты - Булево
//       * СхемаМодифицирована - Булево
//       * ПредопределенныеВарианты - СписокЗначений:
//           ** Значение      - Строка - имя варианта
//           ** Представление - Строка - представление варианта
//       * АдресСхемы - Строка - адрес временного хранилища ОтчетОбъект,
//                               полученный как РеквизитФормыВЗначение("Отчет").
//       * КлючСхемы - Строка
//       * Контекстный - Булево - Истина, когда заполнен КонтекстВарианта.
//       * ПолноеИмя - Строка - полное имя объекта метаданных отчета.
//       * Наименование - Строка - представление объекта метаданных отчета.
//       * ОтчетСсылка - СправочникСсылка.ИдентификаторыОбъектовМетаданных
//                     - СправочникСсылка.ИдентификаторыОбъектовРасширений
//                     - Строка - полное имя внешнего отчета.
//       * Внешний - Булево - если ОтчетСсылка имеет тип Строка.
//       * Подсистема - СправочникСсылка.ИдентификаторыОбъектовМетаданных
//                    - СправочникСсылка.ИдентификаторыОбъектовРасширений - параметр Подсистема формы отчета.
//       * Безопасный - Булево - если при создании формы БезопасныйРежим() <> Ложь
//       * ИспользуемыеТаблицы - Массив из Строка - полные имена таблиц объектов метаданных
//                             - Неопределено
//       * СвойстваРезультата  - см. ВариантыОтчетовСлужебный.СвойстваРезультатаОтчета
//       * ИспользуемыеПоляУниверсальногоПоискаПоТипам - Соответствие
//       * СобытияНастроек - Соответствие из КлючИЗначение:
//          ** Ключ - Строка - имя события (действия)
//          ** Значение - Строка - представление события (действия)
//       * НовыеНастройкиXML - Неопределено - нет настроек
//                           - Строка
//       * НовыеПользовательскиеНастройкиXML - Неопределено - нет настроек
//                                           - Строка
//       * ФормаНастроекРасширенныйРежим - Число - 0 - обычный, 1 - расширенный.
//       * ФормаНастроекИмяСтраницы - Строка
//       * КлючЗамеров - Неопределено
//                     - Строка
//       
//       Далее свойства из ВариантыОтчетов.ПараметрыКлиента.
//       * ВыполнятьЗамеры - Булево
//       
//       Далее свойства из ОтчетыКлиентСервер.НастройкиОтчетаПоУмолчанию.
//       * ФормироватьСразу - Булево
//       * ВыводитьСуммуВыделенныхЯчеек - Булево
//       * РазрешеноИзменятьСтруктуру - Булево
//       * РазрешеноИзменятьВарианты - Булево
//       * РазрешеноВыбиратьИНастраиватьВариантыБезСохранения - Булево
//       * ПараметрыРасположенияЭлементовУправления - Структура
//                                                  - Неопределено
//       * ЗагрузитьНастройкиПриИзмененииПараметров - Массив
//       * ПоляПоиска - Массив из Строка
//       * ВариантПредставленияПериода - ПеречислениеСсылка.ВариантыПредставленияПериода
//       * ВариантПериода - ПеречислениеСсылка.ВариантыПериода
//       * СкрытьКомандыРассылки - Булево
//       * Печать - Структура:
//           ** ПолеСверху - Число
//           ** ПолеСлева  - Число
//           ** ПолеСнизу  - Число
//           ** ПолеСправа - Число
//           ** ОриентацияСтраницы - ОриентацияСтраницы
//           ** АвтоМасштаб - Булево
//           ** МасштабПечати - Число
//       * События - Структура:
//           ** ПриСозданииНаСервере - Булево
//           ** ПередЗагрузкойНастроекВКомпоновщик - Булево
//           ** ПослеЗагрузкиНастроекВКомпоновщик - Булево
//           ** ПередЗагрузкойВариантаНаСервере - Булево
//           ** ПриЗагрузкеВариантаНаСервере - Булево
//           ** ПриЗагрузкеПользовательскихНастроекНаСервере - Булево
//           ** ПередЗаполнениемПанелиБыстрыхНастроек - Булево
//           ** ПослеЗаполненияПанелиБыстрыхНастроек - Булево
//           ** ПриОпределенииПараметровВыбора - Булево
//           ** ПриОпределенииИспользуемыхТаблиц - Булево
//           ** ПриОпределенииОсновныхПолей - Булево
//           ** ПередФормированиемОтчета - Булево
//
Функция НастройкиФормыОтчета(ОтчетСсылка, КлючВарианта, ОтчетОбъект) Экспорт
	
	ОтчетМетаданные = ОтчетОбъект.Метаданные();
	
	ПредопределенныеВарианты = Новый СписокЗначений;
	Если ОтчетОбъект.СхемаКомпоновкиДанных <> Неопределено Тогда
		Для Каждого Вариант Из ОтчетОбъект.СхемаКомпоновкиДанных.ВариантыНастроек Цикл
			ПредопределенныеВарианты.Добавить(Вариант.Имя, Вариант.Представление);
		КонецЦикла;
	КонецЕсли;
	
	Настройки = НастройкиОтчета(ОтчетСсылка, КлючВарианта, ОтчетОбъект);
	
	Настройки.Вставить("ВариантСсылка", Неопределено);
	Настройки.Вставить("ПредопределенныйСсылка", Неопределено);
	Настройки.Вставить("КлючПредопределенногоВарианта", Неопределено);
	Настройки.Вставить("Пользовательский", Ложь);
	Настройки.Вставить("ТипОтчета", Неопределено);
	Настройки.Вставить("РазрешеноВыбиратьВарианты", Истина);
	Настройки.Вставить("СхемаМодифицирована", Ложь);
	Настройки.Вставить("ПредопределенныеВарианты", ПредопределенныеВарианты);
	Настройки.Вставить("АдресСхемы", "");
	Настройки.Вставить("КлючСхемы", "");
	Настройки.Вставить("Контекстный", Ложь);
	Настройки.Вставить("ПолноеИмя", ОтчетМетаданные.ПолноеИмя());
	Настройки.Вставить("Наименование", СокрЛП(ОтчетМетаданные.Представление()));
	Настройки.Вставить("ОтчетСсылка", ОтчетСсылка);
	Настройки.Вставить("Подсистема", Неопределено);
	Настройки.Вставить("Внешний", ТипЗнч(Настройки.ОтчетСсылка) = Тип("Строка"));
	Настройки.Вставить("Безопасный", БезопасныйРежим() <> Ложь);
	Настройки.Вставить("ИспользуемыеТаблицы", Неопределено);
	Настройки.Вставить("СвойстваРезультата", ВариантыОтчетовСлужебный.СвойстваРезультатаОтчета());
	Настройки.Вставить("ИспользуемыеПоляУниверсальногоПоискаПоТипам", Новый Соответствие);
	Настройки.Вставить("СобытияНастроек", Новый Соответствие);
	Настройки.Вставить("ПрочитатьФлажокФормироватьСразуИзПользовательскихНастроек", Истина);
	Настройки.Вставить("НовыеНастройкиXML", Неопределено);
	Настройки.Вставить("НовыеПользовательскиеНастройкиXML", Неопределено);
	Настройки.Вставить("ФормаНастроекРасширенныйРежим", 0);
	Настройки.Вставить("ФормаНастроекИмяСтраницы", "СтраницаОтборы");
	Настройки.Вставить("КлючЗамеров", Неопределено);
	Настройки.Вставить("Назначение", Перечисления.НазначенияВариантовОтчетов.ДляЛюбыхУстройств);
	Настройки.Вставить("ИспользоватьСнимкиОтчетов", Ложь);
	
	ОбщегоНазначенияКлиентСервер.ДополнитьСтруктуру(Настройки, ПараметрыКлиента());
	
	Возврат Настройки;
	
КонецФункции

// Параметры:
//  ПараметрыФормы - Структура
//
// Возвращаемое значение:
//  Структура:
//   * СформироватьПриОткрытии - Булево
//   * Отбор - Структура - отбор, передаваемый в форму
//   * КлючНазначенияИспользования - Строка
//   * КлючПользовательскихНастроек - Строка
//   * ТолькоПросмотр - Булево
//   * ФиксированныеНастройки - Неопределено
//                            - НастройкиКомпоновкиДанных
//   * Раздел - Строка
//   * Подсистема - СправочникСсылка.ИдентификаторыОбъектовМетаданных
//                - СправочникСсылка.ИдентификаторыОбъектовРасширений
//   * ПодсистемаПредставление - Строка
//   * НачальныйКлючПредопределенногоВарианта - Строка
//   * НачальныйКлючВарианта - Строка
//
Функция СохраняемыеПараметрыФормыОтчета(ПараметрыФормы) Экспорт
	
	Параметры = Новый Структура;
	Параметры.Вставить("СформироватьПриОткрытии", Ложь);
	Параметры.Вставить("Отбор", Новый Структура);
	Параметры.Вставить("КлючНазначенияИспользования", "");
	Параметры.Вставить("КлючПользовательскихНастроек", "");
	Параметры.Вставить("ТолькоПросмотр", Ложь);
	Параметры.Вставить("ФиксированныеНастройки", Неопределено);
	Параметры.Вставить("Раздел", Неопределено);
	Параметры.Вставить("Подсистема", Неопределено);
	Параметры.Вставить("ПодсистемаПредставление", "");
	Параметры.Вставить("НачальныйКлючПредопределенногоВарианта", "");
	Параметры.Вставить("НачальныйКлючВарианта", "");
	
	ЗаполнитьЗначенияСвойств(Параметры, ПараметрыФормы,, "Отбор");
	Если ТипЗнч(ПараметрыФормы.Отбор) = Тип("Структура") Тогда
		ОбщегоНазначенияКлиентСервер.ДополнитьСтруктуру(Параметры.Отбор, ПараметрыФормы.Отбор, Истина);
		ПараметрыФормы.Отбор.Очистить();
	КонецЕсли;
	
	Возврат Параметры;
	
КонецФункции

// Параметры:
//  Форма - ФормаКлиентскогоПриложения:
//   * КлючТекущегоВарианта - Строка
//   * ФормаПараметры  - см. СохраняемыеПараметрыФормыОтчета
//   * НастройкиОтчета - см. НастройкиФормыОтчета
//
// Возвращаемое значение:
//  Булево
//
Функция ДопустимоУстановитьКонтекст(Форма) Экспорт
	
	Если Форма.ФормаПараметры.НачальныйКлючПредопределенногоВарианта
	   = Форма.НастройкиОтчета.КлючПредопределенногоВарианта
	 Или Форма.ФормаПараметры.НачальныйКлючВарианта
	   = Форма.КлючТекущегоВарианта Тогда
		
		Возврат Истина;
	КонецЕсли;
	
	Возврат Ложь;
	
КонецФункции


// Параметры:
//  ОтчетСсылка - СправочникСсылка.ВариантыОтчетов
//  КлючВарианта - Строка
//  ОтчетОбъект - ОтчетОбъект
//
// Возвращаемое значение:
//   см. ОтчетыКлиентСервер.НастройкиОтчетаПоУмолчанию
//
Функция НастройкиОтчета(ОтчетСсылка, КлючВарианта, ОтчетОбъект)
	НастройкиОтчета = ОтчетыКлиентСервер.НастройкиОтчетаПоУмолчанию();
	
	ОтчетыСНастройками = ВариантыОтчетовПовтИсп.Параметры().ОтчетыСНастройками;
	Если ОтчетыСНастройками.Найти(ОтчетСсылка) = Неопределено 
		И (ОтчетОбъект = Неопределено Или Метаданные.Отчеты.Содержит(ОтчетОбъект.Метаданные()))Тогда
		Возврат НастройкиОтчета;
	КонецЕсли;
	
	Если ОтчетОбъект = Неопределено Тогда
		Подключение = ПодключитьОтчетОбъект(ОтчетСсылка, Ложь);
		Если Подключение.Успех Тогда
			ОтчетОбъект = Подключение.Объект;
		Иначе
			Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Не удалось получить настройки отчета ""%1"":'") + Символы.ПС + Подключение.ТекстОшибки,
				ОтчетСсылка);
			ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Информация, Текст, ОтчетСсылка);
			Возврат НастройкиОтчета;
		КонецЕсли;
	КонецЕсли;
	
	Попытка
		ОтчетОбъект.ОпределитьНастройкиФормы(Неопределено, КлючВарианта, НастройкиОтчета);
	Исключение
		Если ЭтоВнешнийОтчет(ОтчетОбъект) Тогда
			НастройкиОтчета = ОтчетыКлиентСервер.НастройкиОтчетаПоУмолчанию();
		Иначе
			МетаданныеОтчета = ОтчетОбъект.Метаданные();
			ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Отчет ""%1"" (%2) подключен к подсистеме
				           |""Варианты отчетов"", но при получении настроек возникла следующая ошибка
				           |(возможно процедура %3 не указана разработчиком отчета или не обновлен кэш вариантов отчетов):
				           |
				           |%4'"),
				МетаданныеОтчета.Представление(),
				МетаданныеОтчета.ПолноеИмя(),
				"ОпределитьНастройкиФормы",
				ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
			ВызватьИсключение ТекстОшибки;
		КонецЕсли;
	КонецПопытки;
	
	Если Не ГлобальныеНастройки().РазрешеноИзменятьВарианты Тогда
		НастройкиОтчета.РазрешеноИзменятьВарианты = Ложь;
	КонецЕсли;
	
	Возврат НастройкиОтчета;
КонецФункции

Функция ЭтоВнешнийОтчет(ОтчетОбъект)
	Если ОтчетОбъект = Неопределено Тогда
		Возврат Ложь;
	КонецЕсли;
	
	ИмяОтчета = ОтчетОбъект.Метаданные().Имя;
	Если Метаданные.Отчеты.Найти(ИмяОтчета) <> Неопределено
		И ТипЗнч(ОтчетОбъект) = Тип("ОтчетОбъект." + ИмяОтчета) Тогда
		Возврат Ложь;
	КонецЕсли;
	Возврат Истина;
КонецФункции

////////////////////////////////////////////////////////////////////////////////
// Поиск.

// Параметры:
//  ПараметрыПоиска - Структура
//
// Возвращаемое значение:
//   см. НайтиВариантыОтчетов
//
Функция ТаблицаВариантовОтчетов(Знач ПараметрыПоиска) Экспорт
	
	Возврат НайтиВариантыОтчетов(ПараметрыПоиска, Истина).ТаблицаЗначений;
	
КонецФункции

// Возвращает список вариантов отчетов согласно заданным параметрам.
// При поиске по подстроке СтрокаПоиска также подсвечивает найденные места в названиях и описаниях отчетов.
//
// Параметры:
//   ПараметрыПоиска - Структура:
//     * СтрокаПоиска  - Строка - необязательный. Одно или несколько слов, которые содержатся в названиях и описаниях 
//                                искомых вариантов отчетов.
//     * Подсистемы    - Массив из СправочникСсылка.ИдентификаторыОбъектовМетаданных - необязательный.
//                       Искать только среди вариантов отчетов, относящихся к указанным подсистемам.
//     * ЖесткийОтборПоПодсистемам - Булево - необязательный. Если Истина, выдавать результаты только из указанных подсистем.
//                       Иначе предлагать также релевантные результаты поиска из других подсистем.
//     * Отчеты        - Массив из СправочникСсылка.ВариантыОтчетов - необязательный. Искать только среди указанных отчетов.
//     * ТипыОтчетов   - Массив из ПеречислениеСсылка.ТипыОтчетов - необязательный. Искать только среди указанных 
//                       типов отчетов.
//     * ПометкаУдаления - Булево - необязательный. Если Ложь, то возвращаются все варианты отчетов. 
//                       Если Истина или не задано, то возвращаются только варианты отчетов, не помеченные на удаление.
//     * ТолькоЛичные  - Булево - необязательный. Если Ложь или не задано, то администратору возвращаются все варианты отчетов,
//                       а пользователю только доступные ему варианты отчетов.
//                       Если Истина, то администратору также возвращаются только личные варианты отчетов как и для
//                       неполноправного пользователя.
//   ПолучатьИтоговуюТаблицу - Булево - если Истина, то в возвращаемом значении заполняется свойство ТаблицаЗначений.
//   ПолучатьПодсветку - Булево - если Истина, то в возвращаемом значении заполняются свойства
//                       ПодсветкаВариантов, Подсистемы, ПодсветкаПодсистем, ВариантыСвязанныеСПодсистемами, РодителиСвязанныеСВариантами. 
//
// Возвращаемое значение: 
//   Структура:
//       * Ссылки - Массив из СправочникСсылка.ВариантыОтчетов - вариантами отчетов, в названиях и описаниях которых,
//                  найдены все искомые слова.
//       * ПодсветкаВариантов - Соответствие из КлючИЗначение - подсветка найденных слов (если задана СтрокаПоиска), где:
//           ** Ключ - СправочникСсылка.ВариантыОтчетов.
//           ** Значение - Структура:
//               *** Ссылка - СправочникСсылка.ВариантыОтчетов
//               *** НаименованияПолей                    - Строка
//               *** НаименованияПараметровИОтборов       - Строка
//               *** КлючевыеСлова                        - Строка
//               *** Описание                             - Строка
//               *** НаименованияПользовательскихНастроек - Строка
//               *** ГдеНайдены                           - Структура:
//                   **** НаименованияПолей                    - Число
//                   **** НаименованияПараметровИОтборов       - Число
//                   **** КлючевыеСлова                        - Число
//                   **** Описание                             - Число
//                   **** НаименованияПользовательскихНастроек - Число
//       * Подсистемы - Массив из СправочникСсылка.ИдентификаторыОбъектовМетаданных - заполняется подсистемами,
//                      в наименованиях которых найдены все искомые слова.
//                      Для таких подсистем должны выводиться все вложенные варианты отчетов.
//       * ПодсветкаПодсистем - Соответствие из КлючИЗначение - подсветка найденных слов (если задана СтрокаПоиска), где:
//           ** Ключ - СправочникСсылка.ВариантыОтчетов
//           ** Значение - Структура:
//               *** Ссылка - СправочникСсылка.ИдентификаторыОбъектовМетаданных
//               *** НаименованиеПодсистемы - Строка
//       * ВариантыСвязанныеСПодсистемами - Соответствие из КлючИЗначение - варианты отчетов и их подсистемы, где:
//           ** Ключ - СправочникСсылка.ВариантыОтчетов - вариант.
//           ** Значение - Массив из СправочникСсылка.ИдентификаторыОбъектовМетаданных - подсистемы.
//       * ТаблицаЗначений - см. ИсходнаяТаблицаВариантовОтчетов
//
Функция НайтиВариантыОтчетов(Знач ПараметрыПоиска, Знач ПолучатьИтоговуюТаблицу = Ложь, Знач ПолучатьПодсветку = Ложь) Экспорт
	
	Если ПредставленияЗаполнены() = "НеЗаполнены" Тогда
		Настройки = ПараметрыОбновленияНастроек();
		Настройки.Отложенное = Истина;
		Обновить(Настройки);
	КонецЕсли;
	
	Если ПараметрыПоиска.Свойство("Подсистемы") Тогда
		ПоискТолькоВариантовБезПодсистем = ?(ПараметрыПоиска.Подсистемы.Найти(Справочники.ИдентификаторыОбъектовМетаданных.ПустаяСсылка())= Неопределено, Ложь, Истина);
		Если ПоискТолькоВариантовБезПодсистем И ПараметрыПоиска.Подсистемы.Количество() = 1 Тогда
			ПараметрыПоиска.Подсистемы = Новый Массив;
		КонецЕсли;
	Иначе
		ПоискТолькоВариантовБезПодсистем = Ложь;
	КонецЕсли;
	
	ЕстьСтрокаПоиска = ПараметрыПоиска.Свойство("СтрокаПоиска") И ЗначениеЗаполнено(ПараметрыПоиска.СтрокаПоиска);
	ЕстьОтборПоОтчетам = ПараметрыПоиска.Свойство("Отчеты") И ЗначениеЗаполнено(ПараметрыПоиска.Отчеты);
	ЕстьОтборПоПодсистемам = ПараметрыПоиска.Свойство("Подсистемы") И ЗначениеЗаполнено(ПараметрыПоиска.Подсистемы);
	ЕстьОтборПоКонтексту = ПараметрыПоиска.Свойство("Контекст");
	
	ЕстьОтборПоТипамОтчетов = ПараметрыПоиска.Свойство("ТипыОтчетов") И ЗначениеЗаполнено(ПараметрыПоиска.ТипыОтчетов);
	
	Результат = Новый Структура;
	Результат.Вставить("Ссылки", Новый Массив);
	Результат.Вставить("ПодсветкаВариантов", Новый Соответствие);
	Результат.Вставить("Подсистемы", Новый Массив);
	Результат.Вставить("ПодсветкаПодсистем", Новый Соответствие);
	Результат.Вставить("ВариантыСвязанныеСПодсистемами", Новый Соответствие);
	Результат.Вставить("РодителиСвязанныеСВариантами", Новый Массив);
	
	Если ПолучатьИтоговуюТаблицу Тогда
		Результат.Вставить("ТаблицаЗначений", Новый ТаблицаЗначений);
	КонецЕсли;
	
	Если Не ЕстьОтборПоПодсистемам И Не ЕстьСтрокаПоиска И Не ЕстьОтборПоТипамОтчетов И Не ЕстьОтборПоОтчетам И Не ПоискТолькоВариантовБезПодсистем Тогда
		Возврат Результат;
	КонецЕсли;
	
	ЕстьОтборПоВидимости = ЕстьОтборПоПодсистемам
		И ПараметрыПоиска.Свойство("ТолькоВидимыеВПанелиОтчетов") 
		И ПараметрыПоиска.ТолькоВидимыеВПанелиОтчетов = Истина;
		
	ТолькоНепомеченныеДляУдаления = ?(ПараметрыПоиска.Свойство("ПометкаУдаления"), ПараметрыПоиска.ПометкаУдаления, Истина);
	
	Если ЕстьОтборПоОтчетам Тогда
		ОтборПоОтчетам = ПараметрыПоиска.Отчеты;
		ПараметрыПоиска.Вставить("ОтключенныеВариантыПрограммы", ОтключенныеВариантыОтчетов(ОтборПоОтчетам));
	Иначе
		ПараметрыПоиска.Вставить("ОтключенныеВариантыПрограммы", ВариантыОтчетовПовтИсп.ОтключенныеВариантыПрограммы());
		ПараметрыПоиска.Вставить("ОтчетыПользователя", ОтчетыТекущегоПользователя());
		ОтборПоОтчетам = ПараметрыПоиска.ОтчетыПользователя;
	КонецЕсли;
	
	ЕстьПравоЧтенияАвторов = ПравоДоступа("Чтение", Метаданные.Справочники.Пользователи);
	ТекущийПользователь = Пользователи.АвторизованныйПользователь();
	ПоказыватьЛичныеВариантыОтчетовДругихАвторов = ПолныеПраваНаВарианты();
	
	Если ПараметрыПоиска.Свойство("ТолькоЛичные") Тогда
		ПоказыватьЛичныеВариантыОтчетовДругихАвторов = ПоказыватьЛичныеВариантыОтчетовДругихАвторов И Не ПараметрыПоиска.ТолькоЛичные;
	КонецЕсли;
	
	ТолькоЛичные = ?(ПараметрыПоиска.Свойство("ТолькоЛичные"), ПараметрыПоиска.ТолькоЛичные, Ложь);
	
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("ТекущийПользователь",          ТекущийПользователь);
	Запрос.УстановитьПараметр("ОтчетыПользователя",           ОтборПоОтчетам);
	Запрос.УстановитьПараметр("ОтключенныеВариантыПрограммы", ПараметрыПоиска.ОтключенныеВариантыПрограммы);
	Запрос.УстановитьПараметр("ВерсияРасширений",             ПараметрыСеанса.ВерсияРасширений);
	Запрос.УстановитьПараметр("НетОтбораПоПометкеУдаления",   НЕ ТолькоНепомеченныеДляУдаления);
	Запрос.УстановитьПараметр("ЕстьПравоЧтенияАвторов",       ЕстьПравоЧтенияАвторов);
	Запрос.УстановитьПараметр("ЕстьОтборПоТипамОтчетов",      ЕстьОтборПоТипамОтчетов);
	Запрос.УстановитьПараметр("ЕстьОтборПоПодсистемам",       ЕстьОтборПоПодсистемам);
	Запрос.УстановитьПараметр("ЕстьОтборПоКонтексту",         ЕстьОтборПоКонтексту);
	Запрос.УстановитьПараметр("ТипыОтчетов",                  ?(ЕстьОтборПоТипамОтчетов, ПараметрыПоиска.ТипыОтчетов, Новый Массив));
	Запрос.УстановитьПараметр("НеПолучатьОписания",           Не ЕстьСтрокаПоиска И Не ПолучатьИтоговуюТаблицу);
	Запрос.УстановитьПараметр("ПолучатьИтоговуюТаблицу",      ПолучатьИтоговуюТаблицу);
	Запрос.УстановитьПараметр("ПоказыватьЛичныеВариантыОтчетовДругихАвторов", ПоказыватьЛичныеВариантыОтчетовДругихАвторов);
	Запрос.УстановитьПараметр("ЭтоОсновнойЯзык",              ОбщегоНазначения.ЭтоОсновнойЯзык());
	Запрос.УстановитьПараметр("КодЯзыка",                     ТекущийЯзык().КодЯзыка);
	Запрос.УстановитьПараметр("ПредставленияПодсистем",       ВариантыОтчетовПовтИсп.ПредставленияПодсистем());
	Запрос.УстановитьПараметр("Контекст",                     ?(ЕстьОтборПоКонтексту, ПараметрыПоиска.Контекст, ""));
	Запрос.УстановитьПараметр("ТолькоЛичные",                 ТолькоЛичные);

	Если ЕстьОтборПоПодсистемам Или ЕстьСтрокаПоиска Или ПоискТолькоВариантовБезПодсистем Тогда
		
		Если ЕстьОтборПоПодсистемам Тогда
			Если ТипЗнч(ПараметрыПоиска.Подсистемы) = Тип("Массив") Тогда
				ПодсистемыОтчетов = ПараметрыПоиска.Подсистемы;
			Иначе
				ПодсистемыОтчетов = Новый Массив;
				ПодсистемыОтчетов.Добавить(ПараметрыПоиска.Подсистемы);
			КонецЕсли;
		Иначе
			ПодсистемыОтчетов = Новый Массив;
		КонецЕсли;
		
		ПодсистемыОтчетов.Добавить(Справочники.ИдентификаторыОбъектовМетаданных.ПустаяСсылка());
		
		Запрос.УстановитьПараметр("ЕстьСтрокаПоиска", ЕстьСтрокаПоиска);
		Запрос.УстановитьПараметр("ПолучатьИтоговуюТаблицу", ПолучатьИтоговуюТаблицу);
		Запрос.УстановитьПараметр("ЕстьОтборПоВидимости", ЕстьОтборПоВидимости);
		Запрос.УстановитьПараметр("ПодсистемыОтчетов", ПодсистемыОтчетов);
		Запрос.УстановитьПараметр("ИскатьВариантыБезПодсистем", (ЕстьСтрокаПоиска И НЕ ЕстьОтборПоПодсистемам) ИЛИ ПоискТолькоВариантовБезПодсистем);
		Запрос.УстановитьПараметр("ПоискТолькоВариантовБезПодсистем", ПоискТолькоВариантовБезПодсистем);
		
		ТекстЗапроса = ТекстЗапросаОтчетовСУточненнымиОтборами();
		
		СловаПоиска = ПодготовитьУсловиеПоискаПоСтроке(Запрос, ТекстЗапроса, ЕстьСтрокаПоиска, ПараметрыПоиска, 
			ЕстьПравоЧтенияАвторов);
	Иначе
		ТекстЗапроса = ТекстЗапросаОтчетовСПростымиОтборами();
		Если ПараметрыПоиска.Свойство("КлючВариантаБезУсловий")
		   И ЗначениеЗаполнено(ПараметрыПоиска.КлючВариантаБезУсловий) Тогда
			
			Запрос.УстановитьПараметр("КлючВариантаБезУсловий", ПараметрыПоиска.КлючВариантаБезУсловий);
			ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ОтборКлючВариантаБезУсловий",
				"ВариантыОтчетов.КлючВарианта = &КлючВариантаБезУсловий");
		Иначе
			ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ОтборКлючВариантаБезУсловий", "ЛОЖЬ");
		КонецЕсли;
	КонецЕсли;
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда
		МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер");
	
		СуффиксТекущегоЯзыка = МодульМультиязычностьСервер.СуффиксТекущегоЯзыка();
		Если ЗначениеЗаполнено(СуффиксТекущегоЯзыка) Тогда
			
			МодульМультиязычностьСервер.ИзменитьПолеЗапросаПодТекущийЯзык(ТекстЗапроса, "ВариантыОтчетов.Наименование");
			МодульМультиязычностьСервер.ИзменитьПолеЗапросаПодТекущийЯзык(ТекстЗапроса, "ВариантыОтчетов.Описание");
			МодульМультиязычностьСервер.ИзменитьПолеЗапросаПодТекущийЯзык(ТекстЗапроса, "ВариантыКонфигурации.Наименование");
			МодульМультиязычностьСервер.ИзменитьПолеЗапросаПодТекущийЯзык(ТекстЗапроса, "ВариантыКонфигурации.Описание");
			
			МодульМультиязычностьСервер.ИзменитьПолеЗапросаПодТекущийЯзык(ТекстЗапроса, "ВариантыРасширений.Наименование");
			МодульМультиязычностьСервер.ИзменитьПолеЗапросаПодТекущийЯзык(ТекстЗапроса, "ВариантыРасширений.Описание");
			МодульМультиязычностьСервер.ИзменитьПолеЗапросаПодТекущийЯзык(ТекстЗапроса, "ВариантыРасширений.НаименованияПолей");
			МодульМультиязычностьСервер.ИзменитьПолеЗапросаПодТекущийЯзык(ТекстЗапроса, "ВариантыРасширений.НаименованияПараметровИОтборов");
			МодульМультиязычностьСервер.ИзменитьПолеЗапросаПодТекущийЯзык(ТекстЗапроса, "ВариантыРасширений.КлючевыеСлова");

			
		КонецЕсли;
	КонецЕсли;

	УстановитьПривилегированныйРежим(Истина);
	
	Запрос.Текст = ТекстЗапроса;
	ИсходнаяТаблица = ИсходнаяТаблицаВариантовОтчетов(Запрос);
	
	Если ПолучатьИтоговуюТаблицу Тогда
		Результат.ТаблицаЗначений = ИсходнаяТаблица;
	КонецЕсли;
	
	Если ИсходнаяТаблица.Количество() = 0 Тогда
		Возврат Результат;
	КонецЕсли;
	
	Если ЕстьСтрокаПоиска И ПолучатьПодсветку Тогда
		СформироватьРезультатыПоиска(СловаПоиска, ИсходнаяТаблица, Результат);
	Иначе
		СформироватьСписокСсылок(ИсходнаяТаблица, Результат.Ссылки);
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

Функция ПодготовитьУсловиеПоискаПоСтроке(Знач Запрос, ТекстЗапроса, Знач ЕстьСтрокаПоиска, Знач ПараметрыПоиска, Знач ПравоЧтенияАвторов)
	
	Если ЕстьСтрокаПоиска Тогда
		СтрокаПоиска = ВРег(СокрЛП(ПараметрыПоиска.СтрокаПоиска));
		СловаПоиска = ВариантыОтчетовКлиентСервер.РазложитьСтрокуПоискаВМассивСлов(СтрокаПоиска);
		ШаблоныПоиска = Новый Массив;
		Для НомерСлова = 1 По СловаПоиска.Количество() Цикл
			Слово = СловаПоиска[НомерСлова - 1];
			ИмяСлова =  "Слово" + Формат(НомерСлова, "ЧГ=");
			Запрос.УстановитьПараметр(ИмяСлова, "%" + ОбщегоНазначения.СформироватьСтрокуДляПоискаВЗапросе(Слово) + "%");
			ШаблонПоиска = СтрЗаменить("&ИмяПоляПоиска ПОДОБНО &ИмяПараметра СПЕЦСИМВОЛ ""~""", "ИмяПараметра", ИмяСлова); // @query-part-1
			ШаблоныПоиска.Добавить(ШаблонПоиска);
		КонецЦикла;
		ШаблонПоиска = СтрСоединить(ШаблоныПоиска, " ИЛИ "); // не локализуется (фрагмент текста запроса)
		
		ПоляПоиска = Новый Массив;
		ПоляПоиска.Добавить("ВариантыОтчетов.ТекущиеНаименованиеВарианта"); 
		ПоляПоиска.Добавить("Размещение.НаименованиеПодсистемы"); 
		ПоляПоиска.Добавить("ВариантыОтчетов.НаименованияПолей"); 
		ПоляПоиска.Добавить("ВариантыОтчетов.НаименованияПараметровИОтборов"); 
		ПоляПоиска.Добавить("ВариантыОтчетов.ТекущиеОписаниеВарианта"); 
		ПоляПоиска.Добавить("ВариантыОтчетов.КлючевыеСлова"); 
		Если ПравоЧтенияАвторов Тогда
			ПоляПоиска.Добавить("ВариантыОтчетов.Автор.Наименование"); 
		КонецЕсли;
		
		Для Индекс = 0 По ПоляПоиска.Количество() - 1 Цикл
			ПоляПоиска[Индекс] = СтрЗаменить(ШаблонПоиска, "&ИмяПоляПоиска", ПоляПоиска[Индекс]);
		КонецЦикла;
		ВариантыИПодсистемыПоСтрокеПоиска = "(" + СтрСоединить(ПоляПоиска, " ИЛИ ") + ")"; // не локализуется (фрагмент текста запроса)
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ВариантыИПодсистемыПоСтрокеПоиска", ВариантыИПодсистемыПоСтрокеПоиска);
		
		ПользовательскиеНастройкиПоСтрокеПоиска = "(" + СтрЗаменить(ШаблонПоиска, "&ИмяПоляПоиска", "Пользовательские.Наименование") + ")";
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПользовательскиеНастройкиПоСтрокеПоиска", ПользовательскиеНастройкиПоСтрокеПоиска);
		
	Иначе
		// Удаление отбора для поиска в данных вариантов отчетов и подсистем.
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И &ВариантыИПодсистемыПоСтрокеПоиска", "");
		// Удаление таблицы для поиска среди пользовательских настроек.
		НачалоВыборкиИзТаблицы = (
		"ОБЪЕДИНИТЬ ВСЕ
		|
		|ВЫБРАТЬ РАЗЛИЧНЫЕ
		|	Пользовательские.Вариант");
		
		ТекстЗапроса = СокрП(Лев(ТекстЗапроса, СтрНайти(ТекстЗапроса, НачалоВыборкиИзТаблицы) - 1));
	КонецЕсли;
	
	Возврат СловаПоиска;
	
КонецФункции

Функция ТекстЗапросаОтчетовСУточненнымиОтборами()
	
	СуффиксТекущегоЯзыка = ОбщегоНазначения.СуффиксЯзыкаТекущегоПользователя();
	
	Если СуффиксТекущегоЯзыка  <> Неопределено Тогда
	
	ТекстЗапросаПредварительный = "ВЫБРАТЬ РАЗРЕШЕННЫЕ
		|	ВариантыОтчетов.Ссылка КАК Ссылка,
		|	ВариантыОтчетов.Родитель КАК Родитель,
		|	ВЫБОР
		|		КОГДА &ЕстьПравоЧтенияАвторов
		|			ТОГДА ВариантыОтчетов.Автор
		|		ИНАЧЕ НЕОПРЕДЕЛЕНО
		|	КОНЕЦ КАК Автор,
		|	ВариантыОтчетов.ТолькоДляАвтора КАК ТолькоДляАвтора,
		|	ВариантыОтчетов.Отчет КАК Отчет,
		|	ВариантыОтчетов.КлючВарианта КАК КлючВарианта,
		|	ВариантыОтчетов.ТипОтчета КАК ТипОтчета,
		|	ВариантыОтчетов.Пользовательский КАК Пользовательский,
		|	ВариантыОтчетов.ПредопределенныйВариант КАК ПредопределенныйВариант,
		|	ВариантыОтчетов.Назначение КАК Назначение,
		|	ВЫБОР
		|		КОГДА ВариантыОтчетов.Пользовательский
		|			ТОГДА ВариантыОтчетов.ИнтерактивнаяПометкаУдаления
		|		КОГДА ВариантыОтчетов.ТипОтчета = ЗНАЧЕНИЕ(Перечисление.ТипыОтчетов.Расширение)
		|			ТОГДА ДоступныеВариантыРасширений.Вариант ЕСТЬ NULL
		|		ИНАЧЕ ЕСТЬNULL(ВариантыКонфигурации.ПометкаУдаления, ВариантыОтчетов.ПометкаУдаления)
		|	КОНЕЦ КАК ПометкаУдаления,
		|	ВЫБОР
		|		КОГДА &НеПолучатьОписания
		|			ТОГДА НЕОПРЕДЕЛЕНО
		|		КОГДА (ВариантыОтчетов.Пользовательский
		|				ИЛИ ВариантыОтчетов.ПредопределенныйВариант В (
		|						НЕОПРЕДЕЛЕНО,
		|						ЗНАЧЕНИЕ(Справочник.ПредопределенныеВариантыОтчетов.ПустаяСсылка),
		|						ЗНАЧЕНИЕ(Справочник.ПредопределенныеВариантыОтчетовРасширений.ПустаяСсылка)))
		|			ТОГДА ВариантыОтчетов.Наименование
		|		ИНАЧЕ ВариантыОтчетов.Наименование
		|		КОНЕЦ КАК ТекущиеНаименованиеВарианта,
		|	ВЫБОР
		|		КОГДА &НеПолучатьОписания
		|			ТОГДА НЕОПРЕДЕЛЕНО
		|		КОГДА ПОДСТРОКА(ВариантыОтчетов.НаименованияПолей, 1, 1) = """"
		|			ТОГДА ВЫРАЗИТЬ(ЕСТЬNULL(ВариантыКонфигурации.НаименованияПолей, ВариантыРасширений.НаименованияПолей) КАК СТРОКА(1000))
		|		ИНАЧЕ ВЫРАЗИТЬ(ВариантыОтчетов.НаименованияПолей КАК СТРОКА(1000))
		|	КОНЕЦ КАК НаименованияПолей,
		|	ВЫБОР
		|		КОГДА &НеПолучатьОписания
		|			ТОГДА НЕОПРЕДЕЛЕНО
		|		КОГДА ПОДСТРОКА(ВариантыОтчетов.НаименованияПараметровИОтборов, 1, 1) = """"
		|			ТОГДА ВЫРАЗИТЬ(ЕСТЬNULL(ВариантыКонфигурации.НаименованияПараметровИОтборов, ВариантыРасширений.НаименованияПараметровИОтборов) КАК СТРОКА(1000))
		|		ИНАЧЕ ВЫРАЗИТЬ(ВариантыОтчетов.НаименованияПараметровИОтборов КАК СТРОКА(1000))
		|	КОНЕЦ КАК НаименованияПараметровИОтборов,
		|	ВЫБОР
		|		КОГДА &НеПолучатьОписания
		|			ТОГДА НЕОПРЕДЕЛЕНО
		|		КОГДА ПОДСТРОКА(ВариантыОтчетов.КлючевыеСлова, 1, 1) = """"
		|			ТОГДА ВЫРАЗИТЬ(ЕСТЬNULL(ВариантыКонфигурации.КлючевыеСлова, ВариантыРасширений.КлючевыеСлова) КАК СТРОКА(1000))
		|		ИНАЧЕ ВЫРАЗИТЬ(ВариантыОтчетов.КлючевыеСлова КАК СТРОКА(1000))
		|	КОНЕЦ КАК КлючевыеСлова,
		|	ВЫБОР
		|		КОГДА ПОДСТРОКА(ВариантыОтчетов.Описание, 1, 1) <> """"
		|			ТОГДА ВЫРАЗИТЬ(ВариантыОтчетов.Описание КАК СТРОКА(1000))
		|		КОГДА ПОДСТРОКА(ВариантыОтчетов.Описание, 1, 1) = """"
		|			ТОГДА ВЫРАЗИТЬ(ЕСТЬNULL(ВариантыКонфигурации.Описание, ВариантыРасширений.Описание) КАК СТРОКА(1000))
		|		ИНАЧЕ ВЫРАЗИТЬ(ВариантыОтчетов.Описание КАК СТРОКА(1000))
		|	КОНЕЦ КАК ТекущиеОписаниеВарианта
		|ПОМЕСТИТЬ ВариантыОтчетов
		|ИЗ
		|	Справочник.ВариантыОтчетов КАК ВариантыОтчетов
		|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПредопределенныеВариантыОтчетовВерсийРасширений КАК ДоступныеВариантыРасширений
		|			ПО ВариантыОтчетов.ПредопределенныйВариант = ДоступныеВариантыРасширений.Вариант
		|			И ДоступныеВариантыРасширений.ВерсияРасширений = &ВерсияРасширений
		|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПредопределенныеВариантыОтчетов КАК ВариантыКонфигурации
		|			ПО ВариантыОтчетов.ПредопределенныйВариант = ВариантыКонфигурации.Ссылка
		|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПредопределенныеВариантыОтчетовРасширений КАК ВариантыРасширений
		|			ПО ВариантыОтчетов.ПредопределенныйВариант = ВариантыРасширений.Ссылка
		|ГДЕ
		|	(НЕ &ЕстьОтборПоТипамОтчетов
		|		ИЛИ ВариантыОтчетов.ТипОтчета В (&ТипыОтчетов))
		|	И ВариантыОтчетов.Отчет В (&ОтчетыПользователя)
		|	И НЕ ВариантыОтчетов.ПредопределенныйВариант В (&ОтключенныеВариантыПрограммы)
		|	И (&ПоказыватьЛичныеВариантыОтчетовДругихАвторов
		|		ИЛИ ВариантыОтчетов.ТолькоДляАвтора = ЛОЖЬ
		|		ИЛИ ВариантыОтчетов.Автор = &ТекущийПользователь)
		|	И ВариантыОтчетов.Контекст = &Контекст
		|
		|ИНДЕКСИРОВАТЬ ПО
		|	Ссылка
		|";
	
	Иначе
	
		ТекстЗапросаПредварительный = "ВЫБРАТЬ РАЗРЕШЕННЫЕ
		|	ВариантыОтчетов.Ссылка КАК Ссылка,
		|	ВариантыОтчетов.Родитель КАК Родитель,
		|	ВЫБОР
		|		КОГДА &ЕстьПравоЧтенияАвторов
		|			ТОГДА ВариантыОтчетов.Автор
		|		ИНАЧЕ НЕОПРЕДЕЛЕНО
		|	КОНЕЦ КАК Автор,
		|	ВариантыОтчетов.ТолькоДляАвтора КАК ТолькоДляАвтора,
		|	ВариантыОтчетов.Отчет КАК Отчет,
		|	ВариантыОтчетов.КлючВарианта КАК КлючВарианта,
		|	ВариантыОтчетов.ТипОтчета КАК ТипОтчета,
		|	ВариантыОтчетов.Пользовательский КАК Пользовательский,
		|	ВариантыОтчетов.ПредопределенныйВариант КАК ПредопределенныйВариант,
		|	ВариантыОтчетов.Назначение КАК Назначение,
		|	ВЫБОР
		|		КОГДА ВариантыОтчетов.Пользовательский
		|			ТОГДА ВариантыОтчетов.ИнтерактивнаяПометкаУдаления
		|		КОГДА ВариантыОтчетов.ТипОтчета = ЗНАЧЕНИЕ(Перечисление.ТипыОтчетов.Расширение)
		|			ТОГДА ДоступныеВариантыРасширений.Вариант ЕСТЬ NULL
		|		ИНАЧЕ ЕСТЬNULL(ВариантыКонфигурации.ПометкаУдаления, ВариантыОтчетов.ПометкаУдаления)
		|	КОНЕЦ КАК ПометкаУдаления,
		|	ВЫБОР
		|		КОГДА &НеПолучатьОписания
		|			ТОГДА НЕОПРЕДЕЛЕНО
		|		КОГДА &ЭтоОсновнойЯзык
		|			И (ВариантыОтчетов.Пользовательский
		|				ИЛИ ВариантыОтчетов.ПредопределенныйВариант В (
		|						НЕОПРЕДЕЛЕНО,
		|						ЗНАЧЕНИЕ(Справочник.ПредопределенныеВариантыОтчетов.ПустаяСсылка),
		|						ЗНАЧЕНИЕ(Справочник.ПредопределенныеВариантыОтчетовРасширений.ПустаяСсылка)))
		|			ТОГДА ВариантыОтчетов.Наименование
		|		КОГДА НЕ &ЭтоОсновнойЯзык
		|			И (ВариантыОтчетов.Пользовательский
		|				ИЛИ ВариантыОтчетов.ПредопределенныйВариант В (
		|						НЕОПРЕДЕЛЕНО,
		|						ЗНАЧЕНИЕ(Справочник.ПредопределенныеВариантыОтчетов.ПустаяСсылка),
		|						ЗНАЧЕНИЕ(Справочник.ПредопределенныеВариантыОтчетовРасширений.ПустаяСсылка)))
		|			ТОГДА ВЫРАЗИТЬ(ЕСТЬNULL(ПредставленияВариантов.Наименование, ВариантыОтчетов.Наименование) КАК СТРОКА(150))
		|		КОГДА &ЭтоОсновнойЯзык
		|			ТОГДА ВЫРАЗИТЬ(ЕСТЬNULL(ЕСТЬNULL(ВариантыКонфигурации.Наименование, ВариантыРасширений.Наименование), ВариантыОтчетов.Наименование) КАК СТРОКА(150))
		|		ИНАЧЕ ВЫРАЗИТЬ(ЕСТЬNULL(ЕСТЬNULL(ПредставленияИзКонфигурации.Наименование, ПредставленияИзРасширений.Наименование), ПредставленияВариантов.Наименование) КАК СТРОКА(150))
		|	КОНЕЦ КАК ТекущиеНаименованиеВарианта,
		|	ВЫБОР
		|		КОГДА &НеПолучатьОписания
		|			ТОГДА НЕОПРЕДЕЛЕНО
		|		КОГДА &ЭтоОсновнойЯзык
		|				И ПОДСТРОКА(ВариантыОтчетов.НаименованияПолей, 1, 1) = """"
		|			ТОГДА ВЫРАЗИТЬ(ЕСТЬNULL(ВариантыКонфигурации.НаименованияПолей, ВариантыРасширений.НаименованияПолей) КАК СТРОКА(1000))
		|		КОГДА НЕ &ЭтоОсновнойЯзык
		|				И ПОДСТРОКА(ВариантыОтчетов.НаименованияПолей, 1, 1) = """"
		|			ТОГДА ВЫРАЗИТЬ(ЕСТЬNULL(ПредставленияИзКонфигурации.НаименованияПолей, ПредставленияИзРасширений.НаименованияПолей) КАК СТРОКА(1000))
		|		ИНАЧЕ ВЫРАЗИТЬ(ВариантыОтчетов.НаименованияПолей КАК СТРОКА(1000))
		|	КОНЕЦ КАК НаименованияПолей,
		|	ВЫБОР
		|		КОГДА &НеПолучатьОписания
		|			ТОГДА НЕОПРЕДЕЛЕНО
		|		КОГДА &ЭтоОсновнойЯзык
		|				И ПОДСТРОКА(ВариантыОтчетов.НаименованияПараметровИОтборов, 1, 1) = """"
		|			ТОГДА ВЫРАЗИТЬ(ЕСТЬNULL(ВариантыКонфигурации.НаименованияПараметровИОтборов, ВариантыРасширений.НаименованияПараметровИОтборов) КАК СТРОКА(1000))
		|		КОГДА НЕ &ЭтоОсновнойЯзык
		|				И ПОДСТРОКА(ВариантыОтчетов.НаименованияПараметровИОтборов, 1, 1) = """"
		|			ТОГДА ВЫРАЗИТЬ(ЕСТЬNULL(ПредставленияИзКонфигурации.НаименованияПараметровИОтборов, ПредставленияИзРасширений.НаименованияПараметровИОтборов) КАК СТРОКА(1000))
		|		ИНАЧЕ ВЫРАЗИТЬ(ВариантыОтчетов.НаименованияПараметровИОтборов КАК СТРОКА(1000))
		|	КОНЕЦ КАК НаименованияПараметровИОтборов,
		|	ВЫБОР
		|		КОГДА &НеПолучатьОписания
		|			ТОГДА НЕОПРЕДЕЛЕНО
		|		КОГДА &ЭтоОсновнойЯзык
		|				И ПОДСТРОКА(ВариантыОтчетов.КлючевыеСлова, 1, 1) = """"
		|			ТОГДА ВЫРАЗИТЬ(ЕСТЬNULL(ВариантыКонфигурации.КлючевыеСлова, ВариантыРасширений.КлючевыеСлова) КАК СТРОКА(1000))
		|		КОГДА НЕ &ЭтоОсновнойЯзык
		|				И ПОДСТРОКА(ВариантыОтчетов.КлючевыеСлова, 1, 1) = """"
		|			ТОГДА ВЫРАЗИТЬ(ЕСТЬNULL(ПредставленияИзКонфигурации.КлючевыеСлова, ПредставленияИзРасширений.КлючевыеСлова) КАК СТРОКА(1000))
		|		ИНАЧЕ ВЫРАЗИТЬ(ВариантыОтчетов.КлючевыеСлова КАК СТРОКА(1000))
		|	КОНЕЦ КАК КлючевыеСлова,
		|	ВЫБОР
		|		КОГДА &ЭтоОсновнойЯзык И ПОДСТРОКА(ВариантыОтчетов.Описание, 1, 1) <> """"
		|			ТОГДА ВЫРАЗИТЬ(ВариантыОтчетов.Описание КАК СТРОКА(1000))
		|		КОГДА &ЭтоОсновнойЯзык И ПОДСТРОКА(ВариантыОтчетов.Описание, 1, 1) = """"
		|			ТОГДА ВЫРАЗИТЬ(ЕСТЬNULL(ВариантыКонфигурации.Описание, ВариантыРасширений.Описание) КАК СТРОКА(1000))
		|		КОГДА НЕ &ЭтоОсновнойЯзык И ПОДСТРОКА(ПредставленияВариантов.Описание, 1, 1) <> """"
		|			ТОГДА ВЫРАЗИТЬ(ПредставленияВариантов.Описание КАК СТРОКА(1000))
		|		ИНАЧЕ ВЫРАЗИТЬ(ЕСТЬNULL(ЕСТЬNULL(ПредставленияИзКонфигурации.Описание, ПредставленияИзРасширений.Описание), ВариантыОтчетов.Описание) КАК СТРОКА(1000))
		|	КОНЕЦ КАК ТекущиеОписаниеВарианта
		|ПОМЕСТИТЬ ВариантыОтчетов
		|ИЗ
		|	Справочник.ВариантыОтчетов КАК ВариантыОтчетов
		|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПредопределенныеВариантыОтчетовВерсийРасширений КАК ДоступныеВариантыРасширений
		|			ПО ВариантыОтчетов.ПредопределенныйВариант = ДоступныеВариантыРасширений.Вариант
		|			И ДоступныеВариантыРасширений.ВерсияРасширений = &ВерсияРасширений
		|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПредопределенныеВариантыОтчетов КАК ВариантыКонфигурации
		|			ПО ВариантыОтчетов.ПредопределенныйВариант = ВариантыКонфигурации.Ссылка
		|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПредопределенныеВариантыОтчетовРасширений КАК ВариантыРасширений
		|			ПО ВариантыОтчетов.ПредопределенныйВариант = ВариантыРасширений.Ссылка
		|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВариантыОтчетов.Представления КАК ПредставленияВариантов
		|			ПО ВариантыОтчетов.Ссылка = ПредставленияВариантов.Ссылка
		|			И ПредставленияВариантов.КодЯзыка = &КодЯзыка
		|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПредопределенныеВариантыОтчетов.Представления КАК ПредставленияИзКонфигурации
		|			ПО ВариантыОтчетов.ПредопределенныйВариант = ПредставленияИзКонфигурации.Ссылка
		|			И ПредставленияИзКонфигурации.КодЯзыка = &КодЯзыка
		|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПредопределенныеВариантыОтчетовРасширений.Представления КАК ПредставленияИзРасширений
		|			ПО ВариантыОтчетов.ПредопределенныйВариант = ПредставленияИзРасширений.Ссылка
		|			И ПредставленияИзРасширений.КодЯзыка = &КодЯзыка
		|ГДЕ
		|	(НЕ &ЕстьОтборПоТипамОтчетов
		|		ИЛИ ВариантыОтчетов.ТипОтчета В (&ТипыОтчетов))
		|	И ВариантыОтчетов.Отчет В (&ОтчетыПользователя)
		|	И НЕ ВариантыОтчетов.ПредопределенныйВариант В (&ОтключенныеВариантыПрограммы)
		|	И (&ПоказыватьЛичныеВариантыОтчетовДругихАвторов
		|		ИЛИ ВариантыОтчетов.ТолькоДляАвтора = ЛОЖЬ
		|		ИЛИ ВариантыОтчетов.Автор = &ТекущийПользователь)
		|	И ВариантыОтчетов.Контекст = &Контекст
		|
		|ИНДЕКСИРОВАТЬ ПО
		|	Ссылка
		|";
		
	КонецЕсли;
	
	ТекстЗапросаОбщий = "ВЫБРАТЬ
	|	ПредставленияПодсистем.Ссылка КАК Ссылка,
	|	ПредставленияПодсистем.Представление КАК Представление
	|ПОМЕСТИТЬ ПредставленияПодсистем
	|ИЗ
	|	&ПредставленияПодсистем КАК ПредставленияПодсистем
	|ГДЕ
	|	НЕ &ЭтоОсновнойЯзык
	|
	|ИНДЕКСИРОВАТЬ ПО
	|	Ссылка
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ РАЗРЕШЕННЫЕ
	|	ВариантыОтчетов.Ссылка КАК Ссылка,
	|	ЕСТЬNULL(РазмещениеОтчетов.Подсистема, ЕСТЬNULL(РазмещениеОтчетовКонфигурации.Подсистема, РазмещениеОтчетовРасширений.Подсистема)) КАК Подсистема
	|ПОМЕСТИТЬ РазмещениеВариантовОтчетов
	|ИЗ
	|	ВариантыОтчетов КАК ВариантыОтчетов
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПредопределенныеВариантыОтчетовВерсийРасширений КАК ДоступныеВариантыРасширений
	|			ПО ДоступныеВариантыРасширений.ВерсияРасширений = &ВерсияРасширений
	|			И ДоступныеВариантыРасширений.Вариант = ВариантыОтчетов.ПредопределенныйВариант
	|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВариантыОтчетов.Размещение КАК РазмещениеОтчетов
	|			ПО РазмещениеОтчетов.Ссылка = ВариантыОтчетов.Ссылка
	|			И (НЕ &ЕстьОтборПоПодсистемам
	|				ИЛИ РазмещениеОтчетов.Подсистема В (&ПодсистемыОтчетов))
	|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПредопределенныеВариантыОтчетов.Размещение КАК РазмещениеОтчетовКонфигурации
	|			ПО РазмещениеОтчетовКонфигурации.Ссылка = ВариантыОтчетов.ПредопределенныйВариант
	|			И (НЕ &ЕстьОтборПоПодсистемам
	|				ИЛИ РазмещениеОтчетовКонфигурации.Подсистема В (&ПодсистемыОтчетов))
	|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПредопределенныеВариантыОтчетовРасширений.Размещение КАК РазмещениеОтчетовРасширений
	|			ПО РазмещениеОтчетовРасширений.Ссылка = ВариантыОтчетов.ПредопределенныйВариант
	|			И (НЕ &ЕстьОтборПоПодсистемам
	|				ИЛИ РазмещениеОтчетовРасширений.Подсистема В (&ПодсистемыОтчетов))
	|ГДЕ
	|	(&НетОтбораПоПометкеУдаления
	|		ИЛИ НЕ ВариантыОтчетов.ПометкаУдаления
	|		ИЛИ НЕ ДоступныеВариантыРасширений.Вариант ЕСТЬ NULL)
	|	И ЕСТЬNULL(РазмещениеОтчетов.Использование, ИСТИНА) 
	|	И НЕ ЕСТЬNULL(РазмещениеОтчетов.Подсистема,
	|		ЕСТЬNULL(РазмещениеОтчетовКонфигурации.Подсистема, РазмещениеОтчетовРасширений.Подсистема)) ЕСТЬ NULL
	|	И (&ПоказыватьЛичныеВариантыОтчетовДругихАвторов
	|		ИЛИ НЕ ВариантыОтчетов.ТолькоДляАвтора
	|		ИЛИ ВариантыОтчетов.Автор = &ТекущийПользователь)
	|
	|ИНДЕКСИРОВАТЬ ПО
	|	Ссылка
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
	|	РазмещениеВариантовОтчетов.Ссылка КАК Ссылка,
	|	РазмещениеВариантовОтчетов.Подсистема,
	|	ДоступныеВариантыОтчетов.Видимость
	|ПОМЕСТИТЬ НастройкиВариантовОтчетов
	|ИЗ
	|	РазмещениеВариантовОтчетов КАК РазмещениеВариантовОтчетов
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
	|			ПО СоставыГруппПользователей.Пользователь = &ТекущийПользователь
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НастройкиВариантовОтчетов КАК ДоступныеВариантыОтчетов
	|			ПО ДоступныеВариантыОтчетов.Вариант = РазмещениеВариантовОтчетов.Ссылка
	|			И ДоступныеВариантыОтчетов.Подсистема В (
	|				РазмещениеВариантовОтчетов.Подсистема,
	|				ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка))
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НастройкиВариантовОтчетов КАК НедоступныеВариантыОтчетов
	|			ПО НедоступныеВариантыОтчетов.Вариант = РазмещениеВариантовОтчетов.Ссылка
	|			И НедоступныеВариантыОтчетов.Подсистема = РазмещениеВариантовОтчетов.Подсистема
	|			И (НедоступныеВариантыОтчетов.Пользователь В (&ТекущийПользователь, НЕОПРЕДЕЛЕНО)
	|				ИЛИ ТИПЗНАЧЕНИЯ(&ТекущийПользователь) = ТИП(Справочник.Пользователи)
	|					И НедоступныеВариантыОтчетов.Пользователь = ЗНАЧЕНИЕ(Справочник.ГруппыПользователей.ВсеПользователи)
	|				ИЛИ ТИПЗНАЧЕНИЯ(&ТекущийПользователь) = ТИП(Справочник.ВнешниеПользователи)
	|					И НедоступныеВариантыОтчетов.Пользователь = ЗНАЧЕНИЕ(Справочник.ГруппыВнешнихПользователей.ВсеВнешниеПользователи))
	|			И НЕ НедоступныеВариантыОтчетов.Видимость
	|ГДЕ
	|	&ЕстьОтборПоВидимости
	|	И ДоступныеВариантыОтчетов.Пользователь В (СоставыГруппПользователей.ГруппаПользователей, НЕОПРЕДЕЛЕНО)
	|	И ДоступныеВариантыОтчетов.Подсистема В (&ПодсистемыОтчетов)
	|	И ДоступныеВариантыОтчетов.Видимость
	|	И НедоступныеВариантыОтчетов.Вариант ЕСТЬ NULL
	|
	|ИНДЕКСИРОВАТЬ ПО
	|	Ссылка
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ РАЗЛИЧНЫЕ
	|	РазмещениеВариантовОтчетов.Ссылка КАК Ссылка,
	|	РазмещениеВариантовОтчетов.Подсистема,
	|	ЕСТЬNULL(ИдентификаторыМетаданных.Синоним, ЕСТЬNULL(ИдентификаторыРасширений.Синоним, ЕСТЬNULL(ПредставленияПодсистем.Представление, """"))) КАК НаименованиеПодсистемы
	|ПОМЕСТИТЬ РазмещениеСУчетомНастроек
	|ИЗ
	|	РазмещениеВариантовОтчетов КАК РазмещениеВариантовОтчетов
	|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ИдентификаторыОбъектовМетаданных КАК ИдентификаторыМетаданных
	|			ПО ИдентификаторыМетаданных.Ссылка = РазмещениеВариантовОтчетов.Подсистема
	|			И &ЭтоОсновнойЯзык
	|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ИдентификаторыОбъектовРасширений КАК ИдентификаторыРасширений
	|			ПО ИдентификаторыРасширений.Ссылка = РазмещениеВариантовОтчетов.Подсистема
	|			И &ЭтоОсновнойЯзык
	|		ЛЕВОЕ СОЕДИНЕНИЕ ПредставленияПодсистем КАК ПредставленияПодсистем
	|			ПО ПредставленияПодсистем.Ссылка = РазмещениеВариантовОтчетов.Подсистема
	|			И НЕ &ЭтоОсновнойЯзык
	|		ЛЕВОЕ СОЕДИНЕНИЕ НастройкиВариантовОтчетов КАК НастройкиВариантовОтчетов
	|			ПО НастройкиВариантовОтчетов.Ссылка = РазмещениеВариантовОтчетов.Ссылка
	|			И НастройкиВариантовОтчетов.Подсистема В (
	|				РазмещениеВариантовОтчетов.Подсистема,
	|				ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка))
	|ГДЕ
	|	НЕ &ЕстьОтборПоВидимости
	|		ИЛИ НастройкиВариантовОтчетов.Видимость = ИСТИНА
	|
	|ИНДЕКСИРОВАТЬ ПО
	|	Ссылка
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ РАЗРЕШЕННЫЕ
	|	ВариантыОтчетов.Ссылка КАК Ссылка,
	|	ВариантыОтчетов.Родитель КАК Родитель,
	|	ВариантыОтчетов.ТекущиеНаименованиеВарианта КАК НаименованиеВарианта,
	|	ВариантыОтчетов.ТолькоДляАвтора КАК ТолькоДляАвтора,
	|	ВЫБОР
	|		КОГДА &ЕстьПравоЧтенияАвторов
	|			ТОГДА ВариантыОтчетов.Автор
	|		ИНАЧЕ НЕОПРЕДЕЛЕНО
	|	КОНЕЦ КАК Автор,
	|	ВЫБОР
	|		КОГДА &ЕстьПравоЧтенияАвторов
	|			ТОГДА ЕСТЬNULL(ВариантыОтчетов.Автор.Наименование, """")
	|		ИНАЧЕ """"
	|	КОНЕЦ КАК АвторПредставление,
	|	ВариантыОтчетов.Отчет КАК Отчет,
	|	ВЫБОР
	|		КОГДА &ПолучатьИтоговуюТаблицу
	|			ТОГДА ВариантыОтчетов.Отчет.Имя
	|		ИНАЧЕ НЕОПРЕДЕЛЕНО
	|	КОНЕЦ КАК ИмяОтчета,
	|	ВариантыОтчетов.КлючВарианта КАК КлючВарианта,
	|	ВариантыОтчетов.ТипОтчета КАК ТипОтчета,
	|	ВариантыОтчетов.Пользовательский КАК Пользовательский,
	|	ВариантыОтчетов.ПредопределенныйВариант КАК ПредопределенныйВариант,
	|	ВариантыОтчетов.Назначение КАК Назначение,
	|	ВариантыОтчетов.НаименованияПараметровИОтборов КАК НаименованияПараметровИОтборов,
	|	ВариантыОтчетов.НаименованияПолей КАК НаименованияПолей,
	|	ВариантыОтчетов.КлючевыеСлова КАК КлючевыеСлова,
	|	ВариантыОтчетов.ТекущиеОписаниеВарианта КАК Описание,
	|	Размещение.Подсистема КАК Подсистема,
	|	Размещение.НаименованиеПодсистемы КАК НаименованиеПодсистемы,
	|	НЕОПРЕДЕЛЕНО КАК КлючПользовательскойНастройки,
	|	НЕОПРЕДЕЛЕНО КАК ПредставлениеПользовательскойНастройки,
	|	ВариантыОтчетов.ПометкаУдаления КАК ПометкаУдаления
	|ИЗ
	|	ВариантыОтчетов КАК ВариантыОтчетов
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РазмещениеСУчетомНастроек КАК Размещение
	|			ПО ВариантыОтчетов.Ссылка = Размещение.Ссылка
	|ГДЕ
	|	(&НетОтбораПоПометкеУдаления
	|		ИЛИ НЕ ВариантыОтчетов.ПометкаУдаления)
	|	И НЕ &ПоискТолькоВариантовБезПодсистем
	|	И &ВариантыИПодсистемыПоСтрокеПоиска
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ
	|	ВариантыОтчетов.Ссылка,
	|	ВариантыОтчетов.Родитель,
	|	ВариантыОтчетов.ТекущиеНаименованиеВарианта,
	|	ВариантыОтчетов.ТолькоДляАвтора,
	|	ВЫБОР
	|		КОГДА &ЕстьПравоЧтенияАвторов
	|			ТОГДА ВариантыОтчетов.Автор
	|		ИНАЧЕ НЕОПРЕДЕЛЕНО
	|	КОНЕЦ,
	|	ВЫБОР
	|		КОГДА &ЕстьПравоЧтенияАвторов
	|			ТОГДА ЕСТЬNULL(ВариантыОтчетов.Автор.Наименование, """")
	|		ИНАЧЕ """"
	|	КОНЕЦ,
	|	ВариантыОтчетов.Отчет,
	|	ВЫБОР
	|		КОГДА &ПолучатьИтоговуюТаблицу
	|			ТОГДА ВариантыОтчетов.Отчет.Имя
	|		ИНАЧЕ НЕОПРЕДЕЛЕНО
	|	КОНЕЦ,
	|	ВариантыОтчетов.КлючВарианта,
	|	ВариантыОтчетов.ТипОтчета,
	|	ВариантыОтчетов.Пользовательский,
	|	ВариантыОтчетов.ПредопределенныйВариант,
	|	ВариантыОтчетов.Назначение,
	|	ВариантыОтчетов.НаименованияПараметровИОтборов,
	|	ВариантыОтчетов.НаименованияПолей,
	|	ВариантыОтчетов.КлючевыеСлова,
	|	ВариантыОтчетов.ТекущиеОписаниеВарианта,
	|	Значение(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка),
	|	Размещение.НаименованиеПодсистемы,
	|	НЕОПРЕДЕЛЕНО,
	|	НЕОПРЕДЕЛЕНО,
	|	ВариантыОтчетов.ПометкаУдаления
	|ИЗ
	|	ВариантыОтчетов КАК ВариантыОтчетов
	|		ЛЕВОЕ СОЕДИНЕНИЕ РазмещениеСУчетомНастроек КАК Размещение
	|		ПО ВариантыОтчетов.Ссылка = Размещение.Ссылка
	|ГДЕ
	|	(&НетОтбораПоПометкеУдаления
	|			ИЛИ НЕ ВариантыОтчетов.ПометкаУдаления)
	|	И &ВариантыИПодсистемыПоСтрокеПоиска
	|	И Размещение.Подсистема ЕСТЬ NULL
	|	И &ИскатьВариантыБезПодсистем
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ РАЗЛИЧНЫЕ
	|	Пользовательские.Вариант,
	|	ВариантыОтчетов.Родитель,
	|	НЕОПРЕДЕЛЕНО,
	|	НЕОПРЕДЕЛЕНО,
	|	НЕОПРЕДЕЛЕНО,
	|	НЕОПРЕДЕЛЕНО,
	|	НЕОПРЕДЕЛЕНО,
	|	НЕОПРЕДЕЛЕНО,
	|	НЕОПРЕДЕЛЕНО,
	|	НЕОПРЕДЕЛЕНО,
	|	НЕОПРЕДЕЛЕНО,
	|	НЕОПРЕДЕЛЕНО,
	|	НЕОПРЕДЕЛЕНО,
	|	НЕОПРЕДЕЛЕНО,
	|	НЕОПРЕДЕЛЕНО,
	|	НЕОПРЕДЕЛЕНО,
	|	НЕОПРЕДЕЛЕНО,
	|	НЕОПРЕДЕЛЕНО,
	|	НЕОПРЕДЕЛЕНО,
	|	Пользовательские.КлючПользовательскойНастройки,
	|	Пользовательские.Наименование,
	|	НЕОПРЕДЕЛЕНО
	|ИЗ
	|	ВариантыОтчетов КАК ВариантыОтчетов
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПользовательскиеНастройкиОтчетов КАК Пользовательские
	|			ПО ВариантыОтчетов.Ссылка = Пользовательские.Вариант
	|ГДЕ
	|	(&НетОтбораПоПометкеУдаления
	|		ИЛИ ВариантыОтчетов.ПометкаУдаления = ЛОЖЬ)
	|	И (&НетОтбораПоПометкеУдаления
	|		ИЛИ Пользовательские.ПометкаУдаления = ЛОЖЬ)
	|	И Пользовательские.Пользователь = &ТекущийПользователь
	|	И НЕ &ПоискТолькоВариантовБезПодсистем
	|	И &ПользовательскиеНастройкиПоСтрокеПоиска";
	
	Возврат ТекстЗапросаПредварительный + ОбщегоНазначения.РазделительПакетаЗапросов() + ТекстЗапросаОбщий;
	
КонецФункции

Функция ТекстЗапросаОтчетовСПростымиОтборами()
	
	СуффиксТекущегоЯзыка = ОбщегоНазначения.СуффиксЯзыкаТекущегоПользователя();
	
	Если СуффиксТекущегоЯзыка <> Неопределено Тогда
		
		ТекстЗапроса = "ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
		|	ВариантыОтчетов.Ссылка КАК Ссылка,
		|	ВариантыОтчетов.Родитель КАК Родитель,
		|	ВЫБОР
		|		КОГДА &НеПолучатьОписания
		|			ТОГДА НЕОПРЕДЕЛЕНО
		|		КОГДА НЕ ПользовательскиеВариантыОтчетов.Ссылка ЕСТЬ NULL
		|			ТОГДА ВариантыОтчетов.Наименование
		|		ИНАЧЕ ВЫРАЗИТЬ(ЕСТЬNULL(ЕСТЬNULL(ВариантыКонфигурации.Наименование, ВариантыРасширений.Наименование), ВариантыОтчетов.Наименование) КАК СТРОКА(1000))
		|	КОНЕЦ КАК Наименование,
		|	ВариантыОтчетов.ТолькоДляАвтора КАК ТолькоДляАвтора,
		|	ВЫБОР
		|		КОГДА &ЕстьПравоЧтенияАвторов
		|			ТОГДА ВариантыОтчетов.Автор
		|		ИНАЧЕ НЕОПРЕДЕЛЕНО
		|	КОНЕЦ КАК Автор,
		|	ВЫБОР
		|		КОГДА &ЕстьПравоЧтенияАвторов
		|			ТОГДА ПРЕДСТАВЛЕНИЕ(ВариантыОтчетов.Автор)
		|		ИНАЧЕ """"
		|	КОНЕЦ КАК АвторПредставление,
		|	ВариантыОтчетов.Отчет КАК Отчет,
		|	&ИмяОтчета КАК ИмяОтчета,
		|	ВариантыОтчетов.КлючВарианта КАК КлючВарианта,
		|	ВариантыОтчетов.ТипОтчета КАК ТипОтчета,
		|	ВариантыОтчетов.Пользовательский КАК Пользовательский,
		|	ВариантыОтчетов.ПредопределенныйВариант КАК ПредопределенныйВариант,
		|	ВариантыОтчетов.Назначение КАК Назначение,
		|	ВЫРАЗИТЬ(ВариантыОтчетов.НаименованияПараметровИОтборов КАК СТРОКА(1000)) КАК НаименованияПараметровИОтборов,
		|	ВЫРАЗИТЬ(ВариантыОтчетов.НаименованияПолей КАК СТРОКА(1000)) КАК НаименованияПолей,
		|	ВЫРАЗИТЬ(ВариантыОтчетов.КлючевыеСлова КАК СТРОКА(1000)) КАК КлючевыеСлова,
		|	ВЫБОР
		|		КОГДА ПОДСТРОКА(ВариантыОтчетов.Описание, 1, 1) <> """"
		|			ТОГДА ВЫРАЗИТЬ(ВариантыОтчетов.Описание КАК СТРОКА(1000))
		|		КОГДА ПОДСТРОКА(ВариантыОтчетов.Описание, 1, 1) = """"
		|			ТОГДА ВЫРАЗИТЬ(ЕСТЬNULL(ВариантыКонфигурации.Описание, ВариантыРасширений.Описание) КАК СТРОКА(1000))
		|		ИНАЧЕ ВЫРАЗИТЬ(ВариантыОтчетов.Описание КАК СТРОКА(1000))
		|	КОНЕЦ КАК Описание,
		|	НЕОПРЕДЕЛЕНО КАК Подсистема,
		|	"""" КАК НаименованиеПодсистемы,
		|	НЕОПРЕДЕЛЕНО КАК КлючПользовательскойНастройки,
		|	НЕОПРЕДЕЛЕНО КАК ПредставлениеПользовательскойНастройки,
		|	ВариантыОтчетов.ПометкаУдаления КАК ПометкаУдаления
		|ИЗ
		|	Справочник.ВариантыОтчетов КАК ВариантыОтчетов
		|	ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПредопределенныеВариантыОтчетов КАК ВариантыКонфигурации
		|		ПО ВариантыОтчетов.ПредопределенныйВариант = ВариантыКонфигурации.Ссылка
		|	ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПредопределенныеВариантыОтчетовРасширений КАК ВариантыРасширений
		|		ПО ВариантыОтчетов.ПредопределенныйВариант = ВариантыРасширений.Ссылка
		|	ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК ГруппыТекущегоПользователя
		|		ПО ГруппыТекущегоПользователя.Пользователь = &ТекущийПользователь
		|	ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НастройкиВариантовОтчетов КАК ДоступныеВариантыОтчетов
		|		ПО ДоступныеВариантыОтчетов.Вариант = ВариантыОтчетов.Ссылка
		|	ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВариантыОтчетов КАК ПользовательскиеВариантыОтчетов
		|		ПО ПользовательскиеВариантыОтчетов.Ссылка = ВариантыОтчетов.Ссылка
		|		И (ПользовательскиеВариантыОтчетов.Пользовательский
		|			ИЛИ ПользовательскиеВариантыОтчетов.ПредопределенныйВариант В (
		|				НЕОПРЕДЕЛЕНО,
		|				ЗНАЧЕНИЕ(Справочник.ПредопределенныеВариантыОтчетов.ПустаяСсылка),
		|				ЗНАЧЕНИЕ(Справочник.ПредопределенныеВариантыОтчетовРасширений.ПустаяСсылка)))
		|ГДЕ
		|	ВариантыОтчетов.Отчет В (&ОтчетыПользователя)
		|	И (НЕ &ЕстьОтборПоТипамОтчетов
		|		ИЛИ ВариантыОтчетов.ТипОтчета В (&ТипыОтчетов))
		|	И (НЕ ВариантыОтчетов.Пользовательский
		|		ИЛИ &НетОтбораПоПометкеУдаления
		|		ИЛИ НЕ ВариантыОтчетов.ИнтерактивнаяПометкаУдаления)
		|	И (ВариантыОтчетов.Пользовательский
		|		ИЛИ &НетОтбораПоПометкеУдаления
		|		ИЛИ НЕ ВариантыОтчетов.ПометкаУдаления)
		|	И (&ПоказыватьЛичныеВариантыОтчетовДругихАвторов
		|		ИЛИ НЕ ВариантыОтчетов.ТолькоДляАвтора И ЕСТЬNULL(ДоступныеВариантыОтчетов.Пользователь, Неопределено) В (ГруппыТекущегоПользователя.ГруппаПользователей, Неопределено)
		|		ИЛИ ВариантыОтчетов.Автор = &ТекущийПользователь И ВариантыОтчетов.ТолькоДляАвтора И &ТолькоЛичные
		|		ИЛИ ВариантыОтчетов.Автор = &ТекущийПользователь И НЕ &ТолькоЛичные)
		|	И ЕСТЬNULL(ДоступныеВариантыОтчетов.Видимость, ИСТИНА)
		|	И (&ЕстьОтборПоКонтексту
		|		И (ВариантыОтчетов.ПредопределенныйВариант В (&ОтключенныеВариантыПрограммы)
		|			И (ВариантыКонфигурации.ПоказыватьВПодменюВариантов = ИСТИНА
  		|			ИЛИ ВариантыРасширений.ПоказыватьВПодменюВариантов = ИСТИНА)
		|			ИЛИ НЕ ПользовательскиеВариантыОтчетов.Ссылка ЕСТЬ NULL
		|			И ВариантыОтчетов.Контекст = &Контекст)
		|			ИЛИ НЕ &ЕстьОтборПоКонтексту
		|			И НЕ ВариантыОтчетов.ПредопределенныйВариант В (&ОтключенныеВариантыПрограммы))";

	
	Иначе
		
		ТекстЗапроса =
		"ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
		|	ВариантыОтчетов.Ссылка КАК Ссылка,
		|	ВариантыОтчетов.Родитель КАК Родитель,
		|	ВЫБОР
		|		КОГДА &НеПолучатьОписания
		|			ТОГДА НЕОПРЕДЕЛЕНО
		|		КОГДА &ЭтоОсновнойЯзык
		|			И НЕ ПользовательскиеВариантыОтчетов.Ссылка ЕСТЬ NULL
		|			ТОГДА ВариантыОтчетов.Наименование
		|		КОГДА НЕ &ЭтоОсновнойЯзык
		|			И НЕ ПользовательскиеВариантыОтчетов.Ссылка ЕСТЬ NULL
		|			ТОГДА ВЫРАЗИТЬ(ЕСТЬNULL(ПредставленияВариантов.Наименование, ВариантыОтчетов.Наименование) КАК СТРОКА(150))
		|		КОГДА &ЭтоОсновнойЯзык
		|			ТОГДА ВЫРАЗИТЬ(ЕСТЬNULL(ЕСТЬNULL(ВариантыКонфигурации.Наименование, ВариантыРасширений.Наименование), ВариантыОтчетов.Наименование) КАК СТРОКА(150))
		|		ИНАЧЕ ВЫРАЗИТЬ(ЕСТЬNULL(ЕСТЬNULL(ПредставленияИзКонфигурации.Наименование, ПредставленияИзРасширений.Наименование), ПредставленияВариантов.Наименование) КАК СТРОКА(150))
		|	КОНЕЦ КАК Наименование,
		|	ВариантыОтчетов.ТолькоДляАвтора КАК ТолькоДляАвтора,
		|	ВЫБОР
		|		КОГДА &ЕстьПравоЧтенияАвторов
		|			ТОГДА ВариантыОтчетов.Автор
		|		ИНАЧЕ НЕОПРЕДЕЛЕНО
		|	КОНЕЦ КАК Автор,
		|	ВЫБОР
		|		КОГДА &ЕстьПравоЧтенияАвторов
		|			ТОГДА ПРЕДСТАВЛЕНИЕ(ВариантыОтчетов.Автор)
		|		ИНАЧЕ """"
		|	КОНЕЦ КАК АвторПредставление,
		|	ВариантыОтчетов.Отчет КАК Отчет,
		|	&ИмяОтчета КАК ИмяОтчета,
		|	ВариантыОтчетов.КлючВарианта КАК КлючВарианта,
		|	ВариантыОтчетов.ТипОтчета КАК ТипОтчета,
		|	ВариантыОтчетов.Пользовательский КАК Пользовательский,
		|	ВариантыОтчетов.ПредопределенныйВариант КАК ПредопределенныйВариант,
		|	ВариантыОтчетов.Назначение КАК Назначение,
		|	ВЫРАЗИТЬ(ВариантыОтчетов.НаименованияПараметровИОтборов КАК СТРОКА(1000)) КАК НаименованияПараметровИОтборов,
		|	ВЫРАЗИТЬ(ВариантыОтчетов.НаименованияПолей КАК СТРОКА(1000)) КАК НаименованияПолей,
		|	ВЫРАЗИТЬ(ВариантыОтчетов.КлючевыеСлова КАК СТРОКА(1000)) КАК КлючевыеСлова,
		|	ВЫБОР
		|		КОГДА &ЭтоОсновнойЯзык И ПОДСТРОКА(ВариантыОтчетов.Описание, 1, 1) <> """"
		|			ТОГДА ВЫРАЗИТЬ(ВариантыОтчетов.Описание КАК СТРОКА(1000))
		|		КОГДА &ЭтоОсновнойЯзык И ПОДСТРОКА(ВариантыОтчетов.Описание, 1, 1) = """"
		|			ТОГДА ВЫРАЗИТЬ(ЕСТЬNULL(ВариантыКонфигурации.Описание, ВариантыРасширений.Описание) КАК СТРОКА(1000))
		|		КОГДА НЕ &ЭтоОсновнойЯзык И ПОДСТРОКА(ПредставленияВариантов.Описание, 1, 1) <> """"
		|			ТОГДА ВЫРАЗИТЬ(ПредставленияВариантов.Описание КАК СТРОКА(1000))
		|		ИНАЧЕ ВЫРАЗИТЬ(ЕСТЬNULL(ЕСТЬNULL(ПредставленияИзКонфигурации.Описание, ПредставленияИзРасширений.Описание), ВариантыОтчетов.Описание) КАК СТРОКА(1000))
		|	КОНЕЦ КАК Описание,
		|	НЕОПРЕДЕЛЕНО КАК Подсистема,
		|	"""" КАК НаименованиеПодсистемы,
		|	НЕОПРЕДЕЛЕНО КАК КлючПользовательскойНастройки,
		|	НЕОПРЕДЕЛЕНО КАК ПредставлениеПользовательскойНастройки,
		|	ВариантыОтчетов.ПометкаУдаления КАК ПометкаУдаления
		|ИЗ
		|	Справочник.ВариантыОтчетов КАК ВариантыОтчетов
		|	ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПредопределенныеВариантыОтчетов КАК ВариантыКонфигурации
		|		ПО ВариантыОтчетов.ПредопределенныйВариант = ВариантыКонфигурации.Ссылка
		|	ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПредопределенныеВариантыОтчетовРасширений КАК ВариантыРасширений
		|		ПО ВариантыОтчетов.ПредопределенныйВариант = ВариантыРасширений.Ссылка
		|	ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВариантыОтчетов.Представления КАК ПредставленияВариантов
		|		ПО ВариантыОтчетов.Ссылка = ПредставленияВариантов.Ссылка
		|		И (ПредставленияВариантов.КодЯзыка = &КодЯзыка)
		|	ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПредопределенныеВариантыОтчетов.Представления КАК ПредставленияИзКонфигурации
		|		ПО ВариантыОтчетов.ПредопределенныйВариант = ПредставленияИзКонфигурации.Ссылка
		|		И (ПредставленияИзКонфигурации.КодЯзыка = &КодЯзыка)
		|	ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПредопределенныеВариантыОтчетовРасширений.Представления КАК ПредставленияИзРасширений
		|		ПО ВариантыОтчетов.ПредопределенныйВариант = ПредставленияИзРасширений.Ссылка
		|		И (ПредставленияИзРасширений.КодЯзыка = &КодЯзыка)
		|	ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК ГруппыТекущегоПользователя
		|		ПО ГруппыТекущегоПользователя.Пользователь = &ТекущийПользователь
		|	ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НастройкиВариантовОтчетов КАК ДоступныеВариантыОтчетов
		|		ПО ДоступныеВариантыОтчетов.Вариант = ВариантыОтчетов.Ссылка
		|	ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВариантыОтчетов КАК ПользовательскиеВариантыОтчетов
		|		ПО ПользовательскиеВариантыОтчетов.Ссылка = ВариантыОтчетов.Ссылка
		|		И (ПользовательскиеВариантыОтчетов.Пользовательский
		|			ИЛИ ПользовательскиеВариантыОтчетов.ПредопределенныйВариант В (
		|				НЕОПРЕДЕЛЕНО,
		|				ЗНАЧЕНИЕ(Справочник.ПредопределенныеВариантыОтчетов.ПустаяСсылка),
		|				ЗНАЧЕНИЕ(Справочник.ПредопределенныеВариантыОтчетовРасширений.ПустаяСсылка)))
		|ГДЕ
		|	ВариантыОтчетов.Отчет В (&ОтчетыПользователя)
		|	И (НЕ &ЕстьОтборПоТипамОтчетов
		|		ИЛИ ВариантыОтчетов.ТипОтчета В (&ТипыОтчетов))
		|	И НЕ ВариантыОтчетов.ПредопределенныйВариант В (&ОтключенныеВариантыПрограммы)
		|	И (НЕ ВариантыОтчетов.Пользовательский
		|		ИЛИ &НетОтбораПоПометкеУдаления
		|		ИЛИ НЕ ВариантыОтчетов.ИнтерактивнаяПометкаУдаления)
		|	И (ВариантыОтчетов.Пользовательский
		|		ИЛИ &НетОтбораПоПометкеУдаления
		|		ИЛИ НЕ ВариантыОтчетов.ПометкаУдаления)
		|	И (&ПоказыватьЛичныеВариантыОтчетовДругихАвторов
		|		ИЛИ НЕ ВариантыОтчетов.ТолькоДляАвтора И ЕСТЬNULL(ДоступныеВариантыОтчетов.Пользователь, Неопределено) В (ГруппыТекущегоПользователя.ГруппаПользователей, Неопределено)
		|		ИЛИ ВариантыОтчетов.Автор = &ТекущийПользователь И ВариантыОтчетов.ТолькоДляАвтора И &ТолькоЛичные
		|		ИЛИ ВариантыОтчетов.Автор = &ТекущийПользователь И НЕ &ТолькоЛичные)
		|	И ЕСТЬNULL(ДоступныеВариантыОтчетов.Видимость, ИСТИНА)
		|	И (&ЕстьОтборПоКонтексту
		|		И (ВариантыОтчетов.ПредопределенныйВариант В (&ОтключенныеВариантыПрограммы)
		|			И (ВариантыКонфигурации.ПоказыватьВПодменюВариантов = ИСТИНА
  		|			ИЛИ ВариантыРасширений.ПоказыватьВПодменюВариантов = ИСТИНА)
		|			ИЛИ НЕ ПользовательскиеВариантыОтчетов.Ссылка ЕСТЬ NULL
		|			И ВариантыОтчетов.Контекст = &Контекст)
		|			ИЛИ НЕ &ЕстьОтборПоКонтексту
		|			И НЕ ВариантыОтчетов.ПредопределенныйВариант В (&ОтключенныеВариантыПрограммы))";
			
	КонецЕсли;
	
	ИмяОтчета = "ВЫБОР
	|		КОГДА &ПолучатьИтоговуюТаблицу И ТИПЗНАЧЕНИЯ(ВариантыОтчетов.Отчет) = ТИП(Справочник.ИдентификаторыОбъектовМетаданных)
	|			ТОГДА ВЫРАЗИТЬ(ВариантыОтчетов.Отчет КАК Справочник.ИдентификаторыОбъектовМетаданных).Имя
	|		КОГДА &ПолучатьИтоговуюТаблицу И ТИПЗНАЧЕНИЯ(ВариантыОтчетов.Отчет) = ТИП(Справочник.ИдентификаторыОбъектовРасширений)
	|			ТОГДА ВЫРАЗИТЬ(ВариантыОтчетов.Отчет КАК Справочник.ИдентификаторыОбъектовРасширений).Имя
	|		КОГДА &ПолучатьИтоговуюТаблицу И ТИПЗНАЧЕНИЯ(ВариантыОтчетов.Отчет) = ТИП(СТРОКА)
	|			ТОГДА ВЫРАЗИТЬ(ВариантыОтчетов.Отчет КАК СТРОКА(150))
	|		ИНАЧЕ НЕОПРЕДЕЛЕНО
	|	КОНЕЦ";
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда 
		МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки");
		ИмяТаблицыДополнительныеОтчеты = МодульДополнительныеОтчетыИОбработки.ИмяТаблицыДополнительныеОтчеты();
		
		ИмяОтчета = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("ВЫБОР
			|		КОГДА &ПолучатьИтоговуюТаблицу И ТИПЗНАЧЕНИЯ(ВариантыОтчетов.Отчет) = ТИП(Справочник.ИдентификаторыОбъектовМетаданных)
			|			ТОГДА ВЫРАЗИТЬ(ВариантыОтчетов.Отчет КАК Справочник.ИдентификаторыОбъектовМетаданных).Имя
			|		КОГДА &ПолучатьИтоговуюТаблицу И ТИПЗНАЧЕНИЯ(ВариантыОтчетов.Отчет) = ТИП(Справочник.ИдентификаторыОбъектовРасширений)
			|			ТОГДА ВЫРАЗИТЬ(ВариантыОтчетов.Отчет КАК Справочник.ИдентификаторыОбъектовРасширений).Имя
			|		КОГДА &ПолучатьИтоговуюТаблицу И ТИПЗНАЧЕНИЯ(ВариантыОтчетов.Отчет) = ТИП(%1)
			|			ТОГДА ВЫРАЗИТЬ(ВариантыОтчетов.Отчет КАК %1).ИмяОбъекта
			|		КОГДА &ПолучатьИтоговуюТаблицу И ТИПЗНАЧЕНИЯ(ВариантыОтчетов.Отчет) = ТИП(СТРОКА)
			|			ТОГДА ВЫРАЗИТЬ(ВариантыОтчетов.Отчет КАК СТРОКА(150))
			|		ИНАЧЕ НЕОПРЕДЕЛЕНО
			|	КОНЕЦ", ИмяТаблицыДополнительныеОтчеты);
	КонецЕсли;
	
	Возврат СтрЗаменить(ТекстЗапроса, "&ИмяОтчета", ИмяОтчета);
	
КонецФункции

// Параметры:
//  Запрос - Запрос
// 
// Возвращаемое значение:
//   ТаблицаЗначений:
//     * Ссылка - СправочникСсылка.ВариантыОтчетов
//     * Родитель - СправочникСсылка.ВариантыОтчетов
//     * Наименование - Строка
//     * ТолькоДляАвтора - Булево
//     * Автор - СправочникСсылка.Пользователи
//             - СправочникСсылка.ВнешниеПользователи
//     * АвторПредставление - Строка
//     * Отчет - СправочникСсылка.ИдентификаторыОбъектовМетаданных
//             - СправочникСсылка.ИдентификаторыОбъектовРасширений
//             - Строка
//             - СправочникСсылка.ДополнительныеОтчетыИОбработки
//     * ИмяОтчета - Строка
//     * КлючВарианта - Строка
//     * ТипОтчета - ПеречислениеСсылка.ТипыОтчетов
//     * Пользовательский - Булево
//     * ПредопределенныйВариант - СправочникСсылка.ПредопределенныеВариантыОтчетов
//                               - СправочникСсылка.ПредопределенныеВариантыОтчетовРасширений
//     * НаименованияПараметровИОтборов - Строка
//     * НаименованияПолей - Строка
//     * КлючевыеСлова - Строка
//     * Описание - Строка
//     * Подсистема - СправочникСсылка.ИдентификаторыОбъектовРасширений
//                  - СправочникСсылка.ИдентификаторыОбъектовМетаданных
//     * НаименованиеПодсистемы - Строка
//     * КлючПользовательскойНастройки - Строка
//     * ПредставлениеПользовательскойНастройки - Строка
//     * ПометкаУдаления - Булево
//
Функция ИсходнаяТаблицаВариантовОтчетов(Запрос) Экспорт
	
	Возврат Запрос.Выполнить().Выгрузить();
	
КонецФункции

// Визуализирует результат поиска вариантов отчетов.
//
// Параметры:
//   МассивСлов - Массив - ключевые слова поискового запроса, где:
//       * Элемент - Строка - ключевое слово.
//   ИсходнаяТаблица - ТаблицаЗначений - результат запроса вариантов отчетов, где:
//       * НаименованиеВарианта - Строка - наименование варианта отчета.
//       * Описание - Строка - краткая справка по варианту отчета.
//       * НаименованияПолей - Строка - строковое перечисление полей отчета.
//       * НаименованияПараметровИОтборов - Строка - строковое перечисление параметров данных и отборов настроек отчета.
//       * КлючевыеСлова - Строка - строковое перечисление ключевых слов.
//       * АвторПредставление - Строка - представление автора отчета.
//       * ПредставлениеПользовательскойНастройки - Строка - наименование пользовательской настройки, которое
//                                                           отображается в списке настроек.
//       * Подсистема - СправочникСсылка.ИдентификаторыОбъектовРасширений
//                    - СправочникСсылка.ИдентификаторыОбъектовМетаданных - ссылка на идентификатор метаданных
//                                                                          подсистемы, в которой размещается отчет.
//       * НаименованиеПодсистемы - Строка - представление подсистемы, в которой размещается отчет.
//       * Ссылка - СправочникСсылка.ВариантыОтчетов - ссылка на вариант отчета.
//   Результат - см. НайтиВариантыОтчетов
//
Процедура СформироватьРезультатыПоиска(Знач МассивСлов, Знач ИсходнаяТаблица, Результат)
	
	ИсходнаяТаблица.Сортировать("Ссылка");
	СтрокаТаблицы = ИсходнаяТаблица[0];
	
	ШаблонОбластиПоиска = Новый ФиксированнаяСтруктура("Значение, КоличествоНайденныхСлов, ПодсветкаСлов", "", 0, Новый СписокЗначений);
	Вариант = СведенияОВариантеОтчета(СтрокаТаблицы.Ссылка, СтрокаТаблицы.Родитель, ШаблонОбластиПоиска);
	
	РазделительПредставления = РазделительПредставления();
	НайденныеСлова = Новый Соответствие;
	
	Количество = ИсходнаяТаблица.Количество();
	Для Индекс = 1 По Количество Цикл
		// Заполнение переменных.
		Если Не ЗначениеЗаполнено(Вариант.НаименованиеВарианта.Значение) И ЗначениеЗаполнено(СтрокаТаблицы.НаименованиеВарианта) Тогда
			Вариант.НаименованиеВарианта.Значение = СтрокаТаблицы.НаименованиеВарианта;
		КонецЕсли;
		Если Не ЗначениеЗаполнено(Вариант.Описание.Значение) И ЗначениеЗаполнено(СтрокаТаблицы.Описание) Тогда
			Вариант.Описание.Значение = СтрокаТаблицы.Описание;
		КонецЕсли;
		Если Не ЗначениеЗаполнено(Вариант.НаименованияПолей.Значение) И ЗначениеЗаполнено(СтрокаТаблицы.НаименованияПолей) Тогда
			Вариант.НаименованияПолей.Значение = СтрокаТаблицы.НаименованияПолей;
		КонецЕсли;
		Если Не ЗначениеЗаполнено(Вариант.НаименованияПараметровИОтборов.Значение) И ЗначениеЗаполнено(СтрокаТаблицы.НаименованияПараметровИОтборов) Тогда
			Вариант.НаименованияПараметровИОтборов.Значение = СтрокаТаблицы.НаименованияПараметровИОтборов;
		КонецЕсли;
		Если Не ЗначениеЗаполнено(Вариант.КлючевыеСлова.Значение) И ЗначениеЗаполнено(СтрокаТаблицы.КлючевыеСлова) Тогда
			Вариант.КлючевыеСлова.Значение = СтрокаТаблицы.КлючевыеСлова;
		КонецЕсли;
		Если Не ЗначениеЗаполнено(Вариант.ПредставлениеАвтора.Значение) И ЗначениеЗаполнено(СтрокаТаблицы.АвторПредставление) Тогда
			Вариант.ПредставлениеАвтора.Значение = СтрокаТаблицы.АвторПредставление;
		КонецЕсли;
		Если ЗначениеЗаполнено(СтрокаТаблицы.ПредставлениеПользовательскойНастройки) Тогда
			Если Вариант.НаименованияПользовательскихНастроек.Значение = "" Тогда
				Вариант.НаименованияПользовательскихНастроек.Значение = СтрокаТаблицы.ПредставлениеПользовательскойНастройки;
			Иначе
				Вариант.НаименованияПользовательскихНастроек.Значение = Вариант.НаименованияПользовательскихНастроек.Значение
				+ РазделительПредставления
				+ СтрокаТаблицы.ПредставлениеПользовательскойНастройки;
			КонецЕсли;
		КонецЕсли;
		
		Если ЗначениеЗаполнено(СтрокаТаблицы.НаименованиеПодсистемы)
			И Вариант.Подсистемы.Найти(СтрокаТаблицы.Подсистема) = Неопределено Тогда
			
			Вариант.Подсистемы.Добавить(СтрокаТаблицы.Подсистема);
			Подсистема = Результат.ПодсветкаПодсистем.Получить(СтрокаТаблицы.Подсистема);
			Если Подсистема = Неопределено Тогда
				Подсистема = Новый Структура;
				Подсистема.Вставить("Ссылка", СтрокаТаблицы.Подсистема);
				Подсистема.Вставить("НаименованиеПодсистемы", Новый Структура(ШаблонОбластиПоиска));
				Подсистема.НаименованиеПодсистемы.Значение = СтрокаТаблицы.НаименованиеПодсистемы;
				
				ВсеСловаНайдены = Истина;
				НайденныеСлова.Вставить(СтрокаТаблицы.Подсистема, Новый Соответствие);
				
				Для Каждого Слово Из МассивСлов Цикл
					Если ОтметитьСлово(Подсистема.НаименованиеПодсистемы, Слово) Тогда
						НайденныеСлова[СтрокаТаблицы.Подсистема].Вставить(Слово, Истина);
					Иначе
						ВсеСловаНайдены = Ложь;
					КонецЕсли;
				КонецЦикла;
				Если ВсеСловаНайдены Тогда
					Результат.Подсистемы.Добавить(Подсистема.Ссылка);
				КонецЕсли;
				Результат.ПодсветкаПодсистем.Вставить(Подсистема.Ссылка, Подсистема);
			КонецЕсли;
			
			НаименованияПодсистем = Вариант.НаименованияПодсистем.Значение;
			Вариант.НаименованияПодсистем.Значение = ?(ПустаяСтрока(НаименованияПодсистем), 
				СтрокаТаблицы.НаименованиеПодсистемы, 
				НаименованияПодсистем + РазделительПредставления + СтрокаТаблицы.НаименованиеПодсистемы);
		КонецЕсли;
		
		Если Индекс < Количество Тогда
			СтрокаТаблицы = ИсходнаяТаблица[Индекс];
		КонецЕсли;
		
		Если Индекс = Количество Или СтрокаТаблицы.Ссылка <> Вариант.Ссылка Тогда
			// Анализ собранной информации о варианте.
			ВсеСловаНайдены = Истина;
			СвязанныеПодсистемы = Новый Массив;
			Для Каждого Слово Из МассивСлов Цикл
				СловоНайдено = ОтметитьСлово(Вариант.НаименованиеВарианта, Слово) 
					Или ОтметитьСлово(Вариант.Описание, Слово)
					Или ОтметитьСлово(Вариант.НаименованияПолей, Слово, Истина)
					Или ОтметитьСлово(Вариант.ПредставлениеАвтора, Слово, Истина)
					Или ОтметитьСлово(Вариант.НаименованияПараметровИОтборов, Слово, Истина)
					Или ОтметитьСлово(Вариант.КлючевыеСлова, Слово, Истина)
					Или ОтметитьСлово(Вариант.НаименованияПользовательскихНастроек, Слово, Истина);
				
				Если Не СловоНайдено Тогда
					Для Каждого ПодсистемаСсылка Из Вариант.Подсистемы Цикл
						Если НайденныеСлова[ПодсистемаСсылка] <> Неопределено Тогда
							СловоНайдено = Истина;
							СвязанныеПодсистемы.Добавить(ПодсистемаСсылка);
						КонецЕсли;
					КонецЦикла;
				КонецЕсли;
				
				Если Не СловоНайдено Тогда
					ВсеСловаНайдены = Ложь;
					Прервать;
				КонецЕсли;
			КонецЦикла;
			
			Если ВсеСловаНайдены Тогда // Регистрация результата.
				Результат.Ссылки.Добавить(Вариант.Ссылка);
				Результат.ПодсветкаВариантов.Вставить(Вариант.Ссылка, Вариант);
				Если СвязанныеПодсистемы.Количество() > 0 Тогда
					Результат.ВариантыСвязанныеСПодсистемами.Вставить(Вариант.Ссылка, СвязанныеПодсистемы);
				КонецЕсли;
				// Удаление связи "от подчиненного", если родитель найден самостоятельно.
				ИндексРодителя = Результат.РодителиСвязанныеСВариантами.Найти(Вариант.Ссылка);
				Если ИндексРодителя <> Неопределено Тогда
					Результат.РодителиСвязанныеСВариантами.Удалить(ИндексРодителя);
				КонецЕсли;
				Если ЗначениеЗаполнено(Вариант.Родитель) И Результат.Ссылки.Найти(Вариант.Родитель) = Неопределено Тогда
					Результат.Ссылки.Добавить(Вариант.Родитель);
					Результат.РодителиСвязанныеСВариантами.Добавить(Вариант.Родитель);
				КонецЕсли;
			КонецЕсли;
			
			Если Индекс = Количество Тогда
				Прервать;
			КонецЕсли;
			
			Вариант = СведенияОВариантеОтчета(СтрокаТаблицы.Ссылка, СтрокаТаблицы.Родитель, ШаблонОбластиПоиска);
		КонецЕсли;
		
	КонецЦикла;

КонецПроцедуры

Функция СведенияОВариантеОтчета(ВариантОтчетаСсылка, РодительСсылка, ШаблонОбластиПоиска)
	
	Вариант = Новый Структура;
	Вариант.Вставить("Ссылка", ВариантОтчетаСсылка);
	Вариант.Вставить("Родитель", РодительСсылка);
	Вариант.Вставить("НаименованиеВарианта",                 Новый Структура(ШаблонОбластиПоиска));
	Вариант.Вставить("Описание",                             Новый Структура(ШаблонОбластиПоиска));
	Вариант.Вставить("НаименованияПолей",                    Новый Структура(ШаблонОбластиПоиска));
	Вариант.Вставить("НаименованияПараметровИОтборов",       Новый Структура(ШаблонОбластиПоиска));
	Вариант.Вставить("КлючевыеСлова",                        Новый Структура(ШаблонОбластиПоиска));
	Вариант.Вставить("НаименованияПользовательскихНастроек", Новый Структура(ШаблонОбластиПоиска));
	Вариант.Вставить("НаименованияПодсистем",                Новый Структура(ШаблонОбластиПоиска));
	Вариант.Вставить("Подсистемы",                           Новый Массив);
	Вариант.Вставить("ПредставлениеАвтора",                  Новый Структура(ШаблонОбластиПоиска));
	Возврат Вариант;
	
КонецФункции

Процедура СформироватьСписокСсылок(Знач ТаблицаЗначений, СписокСсылок)
	
	Дубли = Новый Соответствие;
	ТаблицаВариантов = ТаблицаЗначений.Скопировать(, "Ссылка, Родитель");
	ТаблицаВариантов.Свернуть("Ссылка, Родитель");
	Для Каждого СтрокаТаблицы Из ТаблицаВариантов Цикл
		ВариантОтчетаСсылка = СтрокаТаблицы.Ссылка;
		Если ЗначениеЗаполнено(ВариантОтчетаСсылка) И Дубли[ВариантОтчетаСсылка] = Неопределено Тогда
			СписокСсылок.Добавить(ВариантОтчетаСсылка);
			Дубли.Вставить(ВариантОтчетаСсылка);
			ВариантОтчетаСсылка = СтрокаТаблицы.Родитель;
			Если ЗначениеЗаполнено(ВариантОтчетаСсылка) И Дубли[ВариантОтчетаСсылка] = Неопределено Тогда
				СписокСсылок.Добавить(ВариантОтчетаСсылка);
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры

Функция ОтключенныеВариантыОтчетов(Знач ОтчетыПользователя = Неопределено) Экспорт
	
	Если ОтчетыПользователя = Неопределено Тогда
		ОтчетыПользователя = Новый Массив(ВариантыОтчетовПовтИсп.ДоступныеОтчеты());
	КонецЕсли;
	
	// Получить варианты, недоступные по функциональным опциям.
	
	ТаблицаОпций = ВариантыОтчетовПовтИсп.Параметры().ТаблицаФункциональныхОпций;
	ТаблицаВариантов = ТаблицаОпций.СкопироватьКолонки("ПредопределенныйВариант, ИмяФункциональнойОпции");
	ТаблицаВариантов.Колонки.Добавить("ЗначениеОпции", Новый ОписаниеТипов("Число"));
	
	Для Каждого ОтчетСсылка Из ОтчетыПользователя Цикл
		Найденные = ТаблицаОпций.НайтиСтроки(Новый Структура("Отчет", ОтчетСсылка));
		Для Каждого СтрокаТаблицы Из Найденные Цикл
			СтрокаВариант = ТаблицаВариантов.Добавить();
			ЗаполнитьЗначенияСвойств(СтрокаВариант, СтрокаТаблицы);
			Значение = ПолучитьФункциональнуюОпцию(СтрокаТаблицы.ИмяФункциональнойОпции);
			Если Значение = Истина Тогда
				СтрокаВариант.ЗначениеОпции = 1;
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;
	
	ТаблицаВариантов.Свернуть("ПредопределенныйВариант", "ЗначениеОпции");
	ТаблицаОтключенных = ТаблицаВариантов.Скопировать(Новый Структура("ЗначениеОпции", 0));
	ТаблицаОтключенных.Свернуть("ПредопределенныйВариант");
	ОтключенныеПоФункциональнымОпциям = ТаблицаОтключенных.ВыгрузитьКолонку("ПредопределенныйВариант");
	
	// Добавить варианты, отключенные разработчиком.
	Запрос = Новый Запрос(
	"ВЫБРАТЬ РАЗРЕШЕННЫЕ
	|	ВариантыКонфигурации.Ссылка
	|ИЗ
	|	Справочник.ПредопределенныеВариантыОтчетов КАК ВариантыКонфигурации
	|ГДЕ
	|	ВариантыКонфигурации.Отчет В (&ОтчетыПользователя)
	|	И (НЕ ВариантыКонфигурации.Включен
	|		ИЛИ ВариантыКонфигурации.ПометкаУдаления)
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ
	|	ВариантыРасширений.Ссылка
	|ИЗ
	|	Справочник.ПредопределенныеВариантыОтчетовРасширений КАК ВариантыРасширений
	|	ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПредопределенныеВариантыОтчетовВерсийРасширений КАК Версии
	|		ПО ВариантыРасширений.Ссылка = Версии.Вариант
	|		И ВариантыРасширений.Отчет = Версии.Отчет
	|		И Версии.ВерсияРасширений = &ВерсияРасширений
	|ГДЕ
	|	ВариантыРасширений.Отчет В (&ОтчетыПользователя)
	|	И (НЕ ВариантыРасширений.Включен
	|		ИЛИ Версии.Вариант ЕСТЬ NULL)");
	
	Запрос.УстановитьПараметр("ОтчетыПользователя", ОтчетыПользователя);
	Запрос.УстановитьПараметр("ВерсияРасширений", ПараметрыСеанса.ВерсияРасширений);
	
	ОтключенныеПринудительно = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку(0);
	ОбщегоНазначенияКлиентСервер.ДополнитьМассив(ОтключенныеПоФункциональнымОпциям, ОтключенныеПринудительно);
	
	Возврат ОтключенныеПоФункциональнымОпциям;
	
КонецФункции

// Находит слово и отмечает место, где оно найдено.
//
// Параметры:
//   СтруктураГде - Структура:
//       * Значение - Строка - исходная строка.
//       * КоличествоНайденныхСлов - Число - статистика поиска.
//       * ПодсветкаСлов - СписокЗначений - фрагменты слова, которые подсвечиваются.
//   Слово - Строка - подстрока поиска.
//   ИспользоватьРазделитель - Строка - разделитель слова.
//
// Возвращаемое значение:
//   Булево - если Истина если слово найдено.
//
Функция ОтметитьСлово(СтруктураГде, Слово, ИспользоватьРазделитель = Ложь) Экспорт
	Если СтрНачинаетсяС(СтруктураГде.Значение, "#") Тогда
		СтруктураГде.Значение = Сред(СтруктураГде.Значение, 2);
	КонецЕсли;
	ОстатокВРег = ВРег(СтруктураГде.Значение);
	Позиция = СтрНайти(ОстатокВРег, Слово);
	Если Позиция = 0 Тогда
		Возврат Ложь;
	КонецЕсли;
	Если СтруктураГде.КоличествоНайденныхСлов = 0 Тогда
		// Инициализация переменной, содержащей директивы для подсветки слов.
		СтруктураГде.ПодсветкаСлов = Новый СписокЗначений;
		// Прокрутка фокуса до значащего слова (обнаруженной информации).
		Если ИспользоватьРазделитель Тогда
			РазделительХранения = Символы.ПС;
			РазделительПредставления = РазделительПредставления();
			ДлинаРазделителя = СтрДлина(РазделительХранения);
			Пока Позиция > 10 Цикл
				ПозицияРазделителя = СтрНайти(ОстатокВРег, РазделительХранения);
				Если ПозицияРазделителя = 0 Тогда
					Прервать;
				КонецЕсли;
				Если ПозицияРазделителя < Позиция Тогда
					// Перенос фрагмента до разделителя в конец области.
					СтруктураГде.Значение = (
						Сред(СтруктураГде.Значение, ПозицияРазделителя + ДлинаРазделителя)
						+ РазделительХранения
						+ Лев(СтруктураГде.Значение, ПозицияРазделителя - 1));
					ОстатокВРег = (
						Сред(ОстатокВРег, ПозицияРазделителя + ДлинаРазделителя)
						+ РазделительХранения
						+ Лев(ОстатокВРег, ПозицияРазделителя - 1));
					// Обновление информации о расположении слова.
					Позиция = Позиция - ПозицияРазделителя - ДлинаРазделителя + 1;
				Иначе
					Прервать;
				КонецЕсли;
			КонецЦикла;
			СтруктураГде.Значение = СтрЗаменить(СтруктураГде.Значение, РазделительХранения, РазделительПредставления);
			ОстатокВРег = СтрЗаменить(ОстатокВРег, РазделительХранения, РазделительПредставления);
			Позиция = СтрНайти(ОстатокВРег, Слово);
		КонецЕсли;
	КонецЕсли;
	// Регистрация найденного слова.
	СтруктураГде.КоличествоНайденныхСлов = СтруктураГде.КоличествоНайденныхСлов + 1;
	// Отметка слов.
	ДлинаЛевойЧасти = 0;
	ДлинаСлова = СтрДлина(Слово);
	Пока Позиция > 0 Цикл
		СтруктураГде.ПодсветкаСлов.Добавить(ДлинаЛевойЧасти + Позиция, "+");
		СтруктураГде.ПодсветкаСлов.Добавить(ДлинаЛевойЧасти + Позиция + ДлинаСлова, "-");
		ОстатокВРег = Сред(ОстатокВРег, Позиция + ДлинаСлова);
		ДлинаЛевойЧасти = ДлинаЛевойЧасти + Позиция + ДлинаСлова - 1;
		Позиция = СтрНайти(ОстатокВРег, Слово);
	КонецЦикла;
	Возврат Истина;
КонецФункции

// Возвращает сведения о доступных вариантах отчетов.
//
// Параметры:
//   ПараметрыЗаполнения - Структура
//   АдресРезультата - УникальныйИдентификатор
//                   - Строка
//
Процедура НайтиВариантыОтчетовДляВывода(ПараметрыЗаполнения, АдресРезультата) Экспорт
	
	ТекстЗапроса = ТекстЗапросаДоступныхВариантовОтчетов();
	Запрос = Новый Запрос(ТекстЗапроса);
	
	ПоискПоСтроке = ЗначениеЗаполнено(ПараметрыЗаполнения.СтрокаПоиска);
	ТолькоТекущийРаздел = ПараметрыЗаполнения.РежимНастройки Или Не ПоискПоСтроке Или ПараметрыЗаполнения.ИскатьВоВсехРазделах = 0;
	ТаблицаПодсистем = ПараметрыЗаполнения.ПодсистемыПрограммы; // ТаблицаЗначений
	ТаблицаПодсистем.Индексы.Добавить("Ссылка");
	
	МассивПодсистем = ТаблицаПодсистем.ВыгрузитьКолонку("Ссылка");
	
	СтрокаПустаяПодсистема = ТаблицаПодсистем.Добавить();
	СтрокаПустаяПодсистема.Ссылка = Справочники.ИдентификаторыОбъектовМетаданных.ПустаяСсылка();
	СтрокаПустаяПодсистема.РазделСсылка = Справочники.ИдентификаторыОбъектовМетаданных.ПустаяСсылка(); 
	СтрокаПустаяПодсистема.Представление = НСтр("ru = 'Не включенные в разделы'");
	СтрокаПустаяПодсистема.Приоритет = "999";
	СтрокаПустаяПодсистема.НомерЭлемента = 0;
		
	ПараметрыПоиска = Новый Структура;
	Если ПоискПоСтроке Тогда
		ПараметрыПоиска.Вставить("СтрокаПоиска", ПараметрыЗаполнения.СтрокаПоиска);
	КонецЕсли;
	Если ТолькоТекущийРаздел Тогда
		ПараметрыПоиска.Вставить("Подсистемы", МассивПодсистем);
	КонецЕсли;
	РезультатПоиска = НайтиВариантыОтчетов(ПараметрыПоиска, Ложь, Истина);
	
	Запрос.УстановитьПараметр("ТекущийПользователь", Пользователи.АвторизованныйПользователь());
	Запрос.УстановитьПараметр("МассивПодсистем", МассивПодсистем);
	Запрос.УстановитьПараметр("ТаблицаПодсистем", ТаблицаПодсистем);
	Запрос.УстановитьПараметр("РазделСсылка", ПараметрыЗаполнения.ТекущийРазделСсылка);
	Запрос.УстановитьПараметр("ЭтоОсновнойЯзык", ОбщегоНазначения.ЭтоОсновнойЯзык());
	Запрос.УстановитьПараметр("КодЯзыка", ТекущийЯзык().КодЯзыка);
	Запрос.УстановитьПараметр("ВариантыНайденныеПоиском", РезультатПоиска.Ссылки);
	Запрос.УстановитьПараметр("ПодсистемыНайденныеПоиском", РезультатПоиска.Подсистемы);
	Запрос.УстановитьПараметр("ОтчетыПользователя", ПараметрыПоиска.ОтчетыПользователя);
	Запрос.УстановитьПараметр("ОтключенныеВариантыПрограммы", ПараметрыПоиска.ОтключенныеВариантыПрограммы);
	Запрос.УстановитьПараметр("НетОтбораПоПодсистемамИОтчетам", Не ПоискПоСтроке И ПараметрыПоиска.Подсистемы.Количество() = 0);
	Запрос.УстановитьПараметр("НетОтбораПоВидимости", ПараметрыЗаполнения.РежимНастройки Или ПоискПоСтроке);
	Запрос.УстановитьПараметр("ВерсияРасширений", ПараметрыСеанса.ВерсияРасширений);
	Запрос.УстановитьПараметр("ОтображатьВсеВариантыОтчетов", ПараметрыЗаполнения.ОтображатьВсеВариантыОтчетов);
	Запрос.УстановитьПараметр("НазначенияВариантовОтчетов", ПараметрыЗаполнения.НазначенияВариантовОтчетов);
	Запрос.УстановитьПараметр("ИскатьВоВсехРазделах", ПараметрыЗаполнения.ИскатьВоВсехРазделах);
	Если ПараметрыЗаполнения.ОтображатьВсеВариантыОтчетов Тогда
		Запрос.Текст = СтрЗаменить(Запрос.Текст, "&Параметр1", "ИСТИНА");
	Иначе
		Запрос.Текст = СтрЗаменить(Запрос.Текст, "&Параметр1", "ВариантыОтчетов.Назначение В (&НазначенияВариантовОтчетов)");
	КонецЕсли;

	ТаблицаРезультат = Запрос.Выполнить().Выгрузить();
	ЗаполнитьИменаОтчетов(ТаблицаРезультат);
	
	ТаблицаРезультат.Колонки.Добавить("ВыводитсяВместеСОсновным", Новый ОписаниеТипов("Булево"));
	ТаблицаРезультат.Колонки.Добавить("КоличествоПодчиненных", Новый ОписаниеТипов("Число"));
	ТаблицаРезультат.Индексы.Добавить("Ссылка");
	
	Если ПоискПоСтроке Тогда
		// Удаление записей о вариантах, связанных с подсистемами, если запись не фигурирует в связи.
		Для Каждого КлючИЗначение Из РезультатПоиска.ВариантыСвязанныеСПодсистемами Цикл
			ВариантСсылка = КлючИЗначение.Ключ;
			СвязанныеПодсистемы = КлючИЗначение.Значение;
			Найденные = ТаблицаРезультат.НайтиСтроки(Новый Структура("Ссылка", ВариантСсылка));
			Для Каждого СтрокаТаблицы Из Найденные Цикл
				Если СвязанныеПодсистемы.Найти(СтрокаТаблицы.Подсистема) = Неопределено Тогда
					ТаблицаРезультат.Удалить(СтрокаТаблицы);
				КонецЕсли;
			КонецЦикла;
		КонецЦикла;
		// Удаление записей о родителях, связанных с вариантами, если родитель пытается вывестись один (без вариантов).
		Для Каждого РодительСсылка Из РезультатПоиска.РодителиСвязанныеСВариантами Цикл
			МестаВывода = ТаблицаРезультат.НайтиСтроки(Новый Структура("Ссылка", РодительСсылка));
			Для Каждого СтрокаТаблицы Из МестаВывода Цикл
				Найденные = ТаблицаРезультат.НайтиСтроки(Новый Структура("Подсистема, Родитель", СтрокаТаблицы.Подсистема, РодительСсылка));
				Если Найденные.Количество() = 0 Тогда
					ТаблицаРезультат.Удалить(СтрокаТаблицы);
				КонецЕсли;
			КонецЦикла;
		КонецЦикла;
	КонецЕсли;
	
	Если ТолькоТекущийРаздел Тогда
		ДругиеРазделы = Новый Массив;
	Иначе
		КопияТаблицы = ТаблицаРезультат.Скопировать();
		КопияТаблицы.Свернуть("РазделСсылка");
		ДругиеРазделы = КопияТаблицы.ВыгрузитьКолонку("РазделСсылка");
		Индекс = ДругиеРазделы.Найти(ПараметрыЗаполнения.ТекущийРазделСсылка);
		Если Индекс <> Неопределено Тогда
			ДругиеРазделы.Удалить(Индекс);
		КонецЕсли;
	КонецЕсли;
	
	МассивСлов = ?(ПоискПоСтроке, 
		ВариантыОтчетовКлиентСервер.РазложитьСтрокуПоискаВМассивСлов(ВРег(СокрЛП(ПараметрыЗаполнения.СтрокаПоиска))),
		Неопределено);
	
	Результат = ВариантыОтчетовДляВывода();
	Результат.ТолькоТекущийРаздел = ТолькоТекущийРаздел;
	Результат.ТаблицаПодсистем = ТаблицаПодсистем;
	Результат.ДругиеРазделы = ДругиеРазделы;
	Результат.Варианты = ТаблицаРезультат;
	Результат.ИспользоватьПодсветку = ПоискПоСтроке;
	Результат.РезультатПоиска = РезультатПоиска;
	Результат.МассивСлов = МассивСлов;
	
	ПоместитьВоВременноеХранилище(Результат, АдресРезультата);
КонецПроцедуры

Функция ТекстЗапросаДоступныхВариантовОтчетов()
	
	СуффиксТекущегоЯзыка = ОбщегоНазначения.СуффиксЯзыкаТекущегоПользователя();
	
	Если СуффиксТекущегоЯзыка <> Неопределено Тогда
		
		ТекстЗапросаПредварительный = "
			|ВЫБРАТЬ РАЗРЕШЕННЫЕ
			|	ВариантыОтчетов.Ссылка КАК Ссылка,
			|	ПредопределенныеРазмещение.Подсистема КАК Подсистема,
			|	ПредопределенныеРазмещение.Важный КАК Важный,
			|	ПредопределенныеРазмещение.СмТакже КАК СмТакже,
			|	ВЫРАЗИТЬ(ЕСТЬNULL(ВариантыКонфигурации.Наименование, ВариантыОтчетов.Наименование) КАК СТРОКА(150)) КАК Наименование,
			|	ВЫБОР
			|		КОГДА ПОДСТРОКА(ВариантыОтчетов.Описание, 1, 1) <> """"
			|			ТОГДА ВЫРАЗИТЬ(ВариантыОтчетов.Описание КАК СТРОКА(1000))
			|		КОГДА ПОДСТРОКА(ВариантыОтчетов.Описание, 1, 1) = """"
			|			ТОГДА ВЫРАЗИТЬ(ЕСТЬNULL(ВариантыКонфигурации.Описание, ВариантыОтчетов.Описание) КАК СТРОКА(1000))
			|		ИНАЧЕ ВЫРАЗИТЬ(ВариантыОтчетов.Описание КАК СТРОКА(1000))
			|	КОНЕЦ КАК Описание,
			|	ВариантыОтчетов.Отчет КАК Отчет,
			|	ВариантыОтчетов.ТипОтчета КАК ТипОтчета,
			|	ВариантыОтчетов.КлючВарианта КАК КлючВарианта,
			|	ВариантыОтчетов.Автор КАК Автор,
			|	ВариантыОтчетов.Родитель КАК Родитель,
			|	ВЫБОР
			|		КОГДА НЕ &ОтображатьВсеВариантыОтчетов
			|			ИЛИ ВариантыОтчетов.Назначение В (&НазначенияВариантовОтчетов)
			|			ТОГДА ИСТИНА
			|		ИНАЧЕ ЛОЖЬ
			|	КОНЕЦ КАК ВидимостьПоНазначению,
			|	ВариантыОтчетов.ПредопределенныйВариант.КлючЗамеров КАК КлючЗамеров
			|ПОМЕСТИТЬ втПредопределенные
			|ИЗ
			|	Справочник.ВариантыОтчетов КАК ВариантыОтчетов
			|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПредопределенныеВариантыОтчетов.Размещение КАК ПредопределенныеРазмещение
			|			ПО (ВариантыОтчетов.Ссылка В (&ВариантыНайденныеПоиском)
			|				ИЛИ (&НетОтбораПоПодсистемамИОтчетам
			|				ИЛИ ПредопределенныеРазмещение.Подсистема В (&ПодсистемыНайденныеПоиском)))
			|			И ВариантыОтчетов.ПредопределенныйВариант = ПредопределенныеРазмещение.Ссылка
			|			И (ПредопределенныеРазмещение.Подсистема В (&МассивПодсистем))
			|			И (ВариантыОтчетов.ПометкаУдаления = ЛОЖЬ)
			|			И (&НетОтбораПоПодсистемамИОтчетам
			|				ИЛИ ВариантыОтчетов.Отчет В (&ОтчетыПользователя))
			|			И (НЕ ПредопределенныеРазмещение.Ссылка В (&ОтключенныеВариантыПрограммы))
			|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПредопределенныеВариантыОтчетов КАК ВариантыКонфигурации
			|			ПО ВариантыОтчетов.ПредопределенныйВариант = ВариантыКонфигурации.Ссылка
			|
			|ГДЕ
			|	НЕ ВариантыОтчетов.ПометкаУдаления
			|	И &Параметр1
			|
			|ОБЪЕДИНИТЬ ВСЕ
			|
			|ВЫБРАТЬ
			|	ВариантыОтчетов.Ссылка,
			|	ПредопределенныеРазмещение.Подсистема,
			|	ПредопределенныеРазмещение.Важный,
			|	ПредопределенныеРазмещение.СмТакже,
			|	ВЫРАЗИТЬ(ЕСТЬNULL(ВариантыРасширений.Наименование, ВариантыОтчетов.Наименование) КАК СТРОКА(150)),
			|	ВЫБОР
			|		КОГДА ПОДСТРОКА(ВариантыОтчетов.Описание, 1, 1) <> """"
			|			ТОГДА ВЫРАЗИТЬ(ВариантыОтчетов.Описание КАК СТРОКА(1000))
			|		КОГДА ПОДСТРОКА(ВариантыОтчетов.Описание, 1, 1) = """"
			|			ТОГДА ВЫРАЗИТЬ(ЕСТЬNULL(ВариантыРасширений.Описание, ВариантыОтчетов.Описание) КАК СТРОКА(1000))
			|		ИНАЧЕ ВЫРАЗИТЬ(ВариантыОтчетов.Описание КАК СТРОКА(1000))
			|	КОНЕЦ,
			|	ВариантыОтчетов.Отчет,
			|	ВариантыОтчетов.ТипОтчета,
			|	ВариантыОтчетов.КлючВарианта,
			|	ВариантыОтчетов.Автор,
			|	ВариантыОтчетов.Родитель,
			|	ВЫБОР
			|		КОГДА НЕ &ОтображатьВсеВариантыОтчетов
			|			ИЛИ ВариантыОтчетов.Назначение В (&НазначенияВариантовОтчетов)
			|			ТОГДА ИСТИНА
			|		ИНАЧЕ ЛОЖЬ
			|	КОНЕЦ,
			|	ВариантыОтчетов.ПредопределенныйВариант.КлючЗамеров
			|ИЗ
			|	Справочник.ВариантыОтчетов КАК ВариантыОтчетов
			|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПредопределенныеВариантыОтчетовРасширений.Размещение КАК ПредопределенныеРазмещение
			|			ПО (ВариантыОтчетов.Ссылка В (&ВариантыНайденныеПоиском)
			|				ИЛИ (&НетОтбораПоПодсистемамИОтчетам
			|				ИЛИ ПредопределенныеРазмещение.Подсистема В (&ПодсистемыНайденныеПоиском)))
			|			И ВариантыОтчетов.ПредопределенныйВариант = ПредопределенныеРазмещение.Ссылка
			|			И (ПредопределенныеРазмещение.Подсистема В (&МассивПодсистем))
			|			И (&НетОтбораПоПодсистемамИОтчетам
			|				ИЛИ ВариантыОтчетов.Отчет В (&ОтчетыПользователя))
			|			И (НЕ ПредопределенныеРазмещение.Ссылка В (&ОтключенныеВариантыПрограммы))
			|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПредопределенныеВариантыОтчетовВерсийРасширений КАК ДоступныеВариантыРасширений
			|			ПО ДоступныеВариантыРасширений.ВерсияРасширений = &ВерсияРасширений
			|			И ДоступныеВариантыРасширений.Вариант = ВариантыОтчетов.ПредопределенныйВариант
			|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПредопределенныеВариантыОтчетовРасширений КАК ВариантыРасширений
			|			ПО ВариантыОтчетов.ПредопределенныйВариант = ВариантыРасширений.Ссылка
			|
			|ГДЕ
			|	(НЕ ВариантыОтчетов.ПометкаУдаления
			|	ИЛИ НЕ ДоступныеВариантыРасширений.Вариант ЕСТЬ NULL)
			|	И &Параметр1
			|;
			|
			|////////////////////////////////////////////////////////////////////////////////
			|ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
			|	РазмещениеОтчетов.Ссылка КАК Ссылка,
			|	РазмещениеОтчетов.Подсистема КАК Подсистема,
			|	РазмещениеОтчетов.Использование КАК Использование,
			|	РазмещениеОтчетов.Важный КАК Важный,
			|	РазмещениеОтчетов.СмТакже КАК СмТакже,
			|	ВЫБОР
			|		КОГДА (ВариантыОтчетов.Пользовательский
			|				ИЛИ ВариантыОтчетов.ПредопределенныйВариант В (
			|					НЕОПРЕДЕЛЕНО,
			|					ЗНАЧЕНИЕ(Справочник.ПредопределенныеВариантыОтчетов.ПустаяСсылка),
			|					ЗНАЧЕНИЕ(Справочник.ПредопределенныеВариантыОтчетовРасширений.ПустаяСсылка)))
			|			ТОГДА ВариантыОтчетов.Наименование
			|		ИНАЧЕ ВЫРАЗИТЬ(ЕСТЬNULL(ЕСТЬNULL(ОтчетыКонфигурации.Наименование, ОтчетыРасширений.Наименование), ВариантыОтчетов.Наименование) КАК СТРОКА(150))
			|	КОНЕЦ КАК Наименование,
			|	ВЫБОР
			|		КОГДА ПОДСТРОКА(ВариантыОтчетов.Описание, 1, 1) <> """"
			|			ТОГДА ВЫРАЗИТЬ(ВариантыОтчетов.Описание КАК СТРОКА(1000))
			|		КОГДА ПОДСТРОКА(ВариантыОтчетов.Описание, 1, 1) = """"
			|			ТОГДА ВЫРАЗИТЬ(ЕСТЬNULL(ОтчетыКонфигурации.Описание, ОтчетыРасширений.Описание) КАК СТРОКА(1000))
			|		ИНАЧЕ ВЫРАЗИТЬ(ВариантыОтчетов.Описание КАК СТРОКА(1000))
			|	КОНЕЦ КАК Описание,
			|	ВариантыОтчетов.Отчет,
			|	ВариантыОтчетов.ТипОтчета,
			|	ВариантыОтчетов.КлючВарианта,
			|	ВариантыОтчетов.Автор,
			|	ВЫБОР
			|		КОГДА ВариантыОтчетов.Родитель = ЗНАЧЕНИЕ(Справочник.ВариантыОтчетов.ПустаяСсылка)
			|			ТОГДА ЗНАЧЕНИЕ(Справочник.ВариантыОтчетов.ПустаяСсылка)
			|		КОГДА ВариантыОтчетов.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.ВариантыОтчетов.ПустаяСсылка)
			|			ТОГДА ВариантыОтчетов.Родитель
			|		ИНАЧЕ ВариантыОтчетов.Родитель.Родитель
			|	КОНЕЦ КАК Родитель,
			|	ВЫБОР
			|		КОГДА НЕ &ОтображатьВсеВариантыОтчетов
			|			ИЛИ ВариантыОтчетов.Назначение В (&НазначенияВариантовОтчетов)
			|			ТОГДА ИСТИНА
			|		ИНАЧЕ ЛОЖЬ
			|	КОНЕЦ КАК ВидимостьПоНазначению,
			|	ВариантыОтчетов.ПредопределенныйВариант.КлючЗамеров КАК КлючЗамеров
			|ПОМЕСТИТЬ втВарианты
			|ИЗ
			|	Справочник.ВариантыОтчетов.Размещение КАК РазмещениеОтчетов
			|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВариантыОтчетов КАК ВариантыОтчетов
			|			ПО ВариантыОтчетов.Ссылка = РазмещениеОтчетов.Ссылка
			|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПредопределенныеВариантыОтчетов КАК ОтчетыКонфигурации
			|			ПО ОтчетыКонфигурации.Ссылка = ВариантыОтчетов.ПредопределенныйВариант
			|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПредопределенныеВариантыОтчетовРасширений КАК ОтчетыРасширений
			|			ПО ОтчетыРасширений.Ссылка = ВариантыОтчетов.ПредопределенныйВариант
			|ГДЕ
			|	(РазмещениеОтчетов.Ссылка В (&ВариантыНайденныеПоиском)
			|		ИЛИ (&НетОтбораПоПодсистемамИОтчетам
			|			ИЛИ РазмещениеОтчетов.Подсистема В (&ПодсистемыНайденныеПоиском)))
			|	И РазмещениеОтчетов.Подсистема В (&МассивПодсистем)
			|	И (НЕ ВариантыОтчетов.ТолькоДляАвтора
			|		ИЛИ ВариантыОтчетов.Автор = &ТекущийПользователь)
			|	И (&НетОтбораПоПодсистемамИОтчетам
			|		ИЛИ ВариантыОтчетов.Отчет В (&ОтчетыПользователя))
			|	И НЕ ВариантыОтчетов.ПредопределенныйВариант В (&ОтключенныеВариантыПрограммы)
			|	И (НЕ ВариантыОтчетов.Пользовательский
			|		ИЛИ НЕ ВариантыОтчетов.ИнтерактивнаяПометкаУдаления)
			|	И (ВариантыОтчетов.Пользовательский
			|		ИЛИ НЕ ВариантыОтчетов.ПометкаУдаления)
			|	И &Параметр1
			|";
			
			Если ЗначениеЗаполнено(СуффиксТекущегоЯзыка) Тогда
				Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда
					МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер");
		
					МодульМультиязычностьСервер.ИзменитьПолеЗапросаПодТекущийЯзык(ТекстЗапросаПредварительный, "ВариантыОтчетов.Наименование");
					МодульМультиязычностьСервер.ИзменитьПолеЗапросаПодТекущийЯзык(ТекстЗапросаПредварительный, "ВариантыОтчетов.Описание");
					
					МодульМультиязычностьСервер.ИзменитьПолеЗапросаПодТекущийЯзык(ТекстЗапросаПредварительный, "ВариантыКонфигурации.Наименование");
					МодульМультиязычностьСервер.ИзменитьПолеЗапросаПодТекущийЯзык(ТекстЗапросаПредварительный, "ВариантыКонфигурации.Описание");
				КонецЕсли;
			КонецЕсли;
			
	Иначе
		
		ТекстЗапросаПредварительный = "
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ РАЗРЕШЕННЫЕ
		|	ВариантыОтчетов.Ссылка КАК Ссылка,
		|	ПредопределенныеРазмещение.Подсистема КАК Подсистема,
		|	ПредопределенныеРазмещение.Важный КАК Важный,
		|	ПредопределенныеРазмещение.СмТакже КАК СмТакже,
		|	ВЫБОР
		|		КОГДА &ЭтоОсновнойЯзык
		|			ТОГДА ВЫРАЗИТЬ(ЕСТЬNULL(ВариантыКонфигурации.Наименование, ВариантыОтчетов.Наименование) КАК СТРОКА(150))
		|		ИНАЧЕ ВЫРАЗИТЬ(ЕСТЬNULL(ПредставленияИзКонфигурации.Наименование, ПредставленияВариантов.Наименование) КАК СТРОКА(150))
		|	КОНЕЦ КАК Наименование,
		|	ВЫБОР
		|		КОГДА &ЭтоОсновнойЯзык И ПОДСТРОКА(ВариантыОтчетов.Описание, 1, 1) <> """"
		|			ТОГДА ВЫРАЗИТЬ(ВариантыОтчетов.Описание КАК СТРОКА(1000))
		|		КОГДА &ЭтоОсновнойЯзык И ПОДСТРОКА(ВариантыОтчетов.Описание, 1, 1) = """"
		|			ТОГДА ВЫРАЗИТЬ(ЕСТЬNULL(ВариантыКонфигурации.Описание, ВариантыОтчетов.Описание) КАК СТРОКА(1000))
		|		КОГДА НЕ &ЭтоОсновнойЯзык И ПОДСТРОКА(ПредставленияВариантов.Описание, 1, 1) <> """"
		|			ТОГДА ВЫРАЗИТЬ(ПредставленияВариантов.Описание КАК СТРОКА(1000))
		|		ИНАЧЕ ВЫРАЗИТЬ(ЕСТЬNULL(ПредставленияИзКонфигурации.Описание, ВариантыОтчетов.Описание) КАК СТРОКА(1000))
		|	КОНЕЦ КАК Описание,
		|	ВариантыОтчетов.Отчет КАК Отчет,
		|	ВариантыОтчетов.ТипОтчета КАК ТипОтчета,
		|	ВариантыОтчетов.КлючВарианта КАК КлючВарианта,
		|	ВариантыОтчетов.Автор КАК Автор,
		|	ВариантыОтчетов.Родитель КАК Родитель,
		|	ВЫБОР
		|		КОГДА НЕ &ОтображатьВсеВариантыОтчетов
		|			ИЛИ ВариантыОтчетов.Назначение В (&НазначенияВариантовОтчетов)
		|			ТОГДА ИСТИНА
		|		ИНАЧЕ ЛОЖЬ
		|	КОНЕЦ КАК ВидимостьПоНазначению,
		|	ВариантыОтчетов.ПредопределенныйВариант.КлючЗамеров КАК КлючЗамеров
		|ПОМЕСТИТЬ втПредопределенные
		|ИЗ
		|	Справочник.ВариантыОтчетов КАК ВариантыОтчетов
		|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПредопределенныеВариантыОтчетов.Размещение КАК ПредопределенныеРазмещение
		|			ПО (ВариантыОтчетов.Ссылка В (&ВариантыНайденныеПоиском)
		|				ИЛИ (&НетОтбораПоПодсистемамИОтчетам
		|				ИЛИ ПредопределенныеРазмещение.Подсистема В (&ПодсистемыНайденныеПоиском)))
		|			И ВариантыОтчетов.ПредопределенныйВариант = ПредопределенныеРазмещение.Ссылка
		|			И (ПредопределенныеРазмещение.Подсистема В (&МассивПодсистем))
		|			И (ВариантыОтчетов.ПометкаУдаления = ЛОЖЬ)
		|			И (&НетОтбораПоПодсистемамИОтчетам
		|				ИЛИ ВариантыОтчетов.Отчет В (&ОтчетыПользователя))
		|			И (НЕ ПредопределенныеРазмещение.Ссылка В (&ОтключенныеВариантыПрограммы))
		|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПредопределенныеВариантыОтчетов КАК ВариантыКонфигурации
		|			ПО ВариантыОтчетов.ПредопределенныйВариант = ВариантыКонфигурации.Ссылка
		|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПредопределенныеВариантыОтчетов.Представления КАК ПредставленияИзКонфигурации
		|			ПО ВариантыОтчетов.ПредопределенныйВариант = ПредставленияИзКонфигурации.Ссылка
		|			И (ПредставленияИзКонфигурации.КодЯзыка = &КодЯзыка)
		|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВариантыОтчетов.Представления КАК ПредставленияВариантов
		|			ПО ВариантыОтчетов.Ссылка = ПредставленияВариантов.Ссылка
		|			И (ПредставленияВариантов.КодЯзыка = &КодЯзыка)
		|ГДЕ
		|	НЕ ВариантыОтчетов.ПометкаУдаления
		|	И &Параметр1
		|
		|ОБЪЕДИНИТЬ ВСЕ
		|
		|ВЫБРАТЬ
		|	ВариантыОтчетов.Ссылка,
		|	ПредопределенныеРазмещение.Подсистема,
		|	ПредопределенныеРазмещение.Важный,
		|	ПредопределенныеРазмещение.СмТакже,
		|	ВЫБОР
		|		КОГДА &ЭтоОсновнойЯзык
		|			ТОГДА ВЫРАЗИТЬ(ЕСТЬNULL(ВариантыРасширений.Наименование, ВариантыОтчетов.Наименование) КАК СТРОКА(150))
		|		ИНАЧЕ ВЫРАЗИТЬ(ЕСТЬNULL(ПредставленияИзРасширений.Наименование, ПредставленияВариантов.Наименование) КАК СТРОКА(150))
		|	КОНЕЦ,
		|	ВЫБОР
		|		КОГДА &ЭтоОсновнойЯзык И ПОДСТРОКА(ВариантыОтчетов.Описание, 1, 1) <> """"
		|			ТОГДА ВЫРАЗИТЬ(ВариантыОтчетов.Описание КАК СТРОКА(1000))
		|		КОГДА &ЭтоОсновнойЯзык И ПОДСТРОКА(ВариантыОтчетов.Описание, 1, 1) = """"
		|			ТОГДА ВЫРАЗИТЬ(ЕСТЬNULL(ВариантыРасширений.Описание, ВариантыОтчетов.Описание) КАК СТРОКА(1000))
		|		КОГДА НЕ &ЭтоОсновнойЯзык И ПОДСТРОКА(ПредставленияВариантов.Описание, 1, 1) <> """"
		|			ТОГДА ВЫРАЗИТЬ(ПредставленияВариантов.Описание КАК СТРОКА(1000))
		|		ИНАЧЕ ВЫРАЗИТЬ(ЕСТЬNULL(ПредставленияИзРасширений.Описание, ВариантыОтчетов.Описание) КАК СТРОКА(1000))
		|	КОНЕЦ,
		|	ВариантыОтчетов.Отчет,
		|	ВариантыОтчетов.ТипОтчета,
		|	ВариантыОтчетов.КлючВарианта,
		|	ВариантыОтчетов.Автор,
		|	ВариантыОтчетов.Родитель,
		|	ВЫБОР
		|		КОГДА НЕ &ОтображатьВсеВариантыОтчетов
		|			ИЛИ ВариантыОтчетов.Назначение В (&НазначенияВариантовОтчетов)
		|			ТОГДА ИСТИНА
		|		ИНАЧЕ ЛОЖЬ
		|	КОНЕЦ,
		|	ВариантыОтчетов.ПредопределенныйВариант.КлючЗамеров
		|ИЗ
		|	Справочник.ВариантыОтчетов КАК ВариантыОтчетов
		|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПредопределенныеВариантыОтчетовРасширений.Размещение КАК ПредопределенныеРазмещение
		|			ПО (ВариантыОтчетов.Ссылка В (&ВариантыНайденныеПоиском)
		|				ИЛИ (&НетОтбораПоПодсистемамИОтчетам
		|				ИЛИ ПредопределенныеРазмещение.Подсистема В (&ПодсистемыНайденныеПоиском)))
		|			И ВариантыОтчетов.ПредопределенныйВариант = ПредопределенныеРазмещение.Ссылка
		|			И (ПредопределенныеРазмещение.Подсистема В (&МассивПодсистем))
		|			И (&НетОтбораПоПодсистемамИОтчетам
		|				ИЛИ ВариантыОтчетов.Отчет В (&ОтчетыПользователя))
		|			И (НЕ ПредопределенныеРазмещение.Ссылка В (&ОтключенныеВариантыПрограммы))
		|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПредопределенныеВариантыОтчетовВерсийРасширений КАК ДоступныеВариантыРасширений
		|			ПО ДоступныеВариантыРасширений.ВерсияРасширений = &ВерсияРасширений
		|			И ДоступныеВариантыРасширений.Вариант = ВариантыОтчетов.ПредопределенныйВариант
		|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПредопределенныеВариантыОтчетовРасширений КАК ВариантыРасширений
		|			ПО ВариантыОтчетов.ПредопределенныйВариант = ВариантыРасширений.Ссылка
		|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПредопределенныеВариантыОтчетовРасширений.Представления КАК ПредставленияИзРасширений
		|			ПО ВариантыОтчетов.ПредопределенныйВариант = ПредставленияИзРасширений.Ссылка
		|			И (ПредставленияИзРасширений.КодЯзыка = &КодЯзыка)
		|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВариантыОтчетов.Представления КАК ПредставленияВариантов
		|			ПО ВариантыОтчетов.Ссылка = ПредставленияВариантов.Ссылка
		|			И (ПредставленияВариантов.КодЯзыка = &КодЯзыка)
		|ГДЕ
		|	(НЕ ВариантыОтчетов.ПометкаУдаления
		|	ИЛИ НЕ ДоступныеВариантыРасширений.Вариант ЕСТЬ NULL)
		|	И &Параметр1
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
		|	РазмещениеОтчетов.Ссылка КАК Ссылка,
		|	РазмещениеОтчетов.Подсистема КАК Подсистема,
		|	РазмещениеОтчетов.Использование КАК Использование,
		|	РазмещениеОтчетов.Важный КАК Важный,
		|	РазмещениеОтчетов.СмТакже КАК СмТакже,
		|	ВЫБОР
		|		КОГДА &ЭтоОсновнойЯзык
		|			И (ВариантыОтчетов.Пользовательский
		|				ИЛИ ВариантыОтчетов.ПредопределенныйВариант В (
		|					НЕОПРЕДЕЛЕНО,
		|					ЗНАЧЕНИЕ(Справочник.ПредопределенныеВариантыОтчетов.ПустаяСсылка),
		|					ЗНАЧЕНИЕ(Справочник.ПредопределенныеВариантыОтчетовРасширений.ПустаяСсылка)))
		|			ТОГДА ВариантыОтчетов.Наименование
		|		КОГДА НЕ &ЭтоОсновнойЯзык
		|			И (ВариантыОтчетов.Пользовательский
		|				ИЛИ ВариантыОтчетов.ПредопределенныйВариант В (
		|					НЕОПРЕДЕЛЕНО,
		|					ЗНАЧЕНИЕ(Справочник.ПредопределенныеВариантыОтчетов.ПустаяСсылка),
		|					ЗНАЧЕНИЕ(Справочник.ПредопределенныеВариантыОтчетовРасширений.ПустаяСсылка)))
		|			ТОГДА ВЫРАЗИТЬ(ЕСТЬNULL(ПредставленияОтчетов.Наименование, ВариантыОтчетов.Наименование) КАК СТРОКА(150))
		|		КОГДА &ЭтоОсновнойЯзык
		|			ТОГДА ВЫРАЗИТЬ(ЕСТЬNULL(ЕСТЬNULL(ОтчетыКонфигурации.Наименование, ОтчетыРасширений.Наименование), ВариантыОтчетов.Наименование) КАК СТРОКА(150))
		|		ИНАЧЕ ВЫРАЗИТЬ(ЕСТЬNULL(ЕСТЬNULL(ПредставленияОтчетовКонфигурации.Наименование, ПредставленияОтчетовРасширений.Наименование), ПредставленияОтчетов.Наименование) КАК СТРОКА(150))
		|	КОНЕЦ КАК Наименование,
		|	ВЫБОР
		|		КОГДА &ЭтоОсновнойЯзык И ПОДСТРОКА(ВариантыОтчетов.Описание, 1, 1) <> """"
		|			ТОГДА ВЫРАЗИТЬ(ВариантыОтчетов.Описание КАК СТРОКА(1000))
		|		КОГДА &ЭтоОсновнойЯзык И ПОДСТРОКА(ВариантыОтчетов.Описание, 1, 1) = """"
		|			ТОГДА ВЫРАЗИТЬ(ЕСТЬNULL(ОтчетыКонфигурации.Описание, ОтчетыРасширений.Описание) КАК СТРОКА(1000))
		|		КОГДА НЕ &ЭтоОсновнойЯзык И ПОДСТРОКА(ПредставленияОтчетов.Описание, 1, 1) <> """"
		|			ТОГДА ВЫРАЗИТЬ(ПредставленияОтчетов.Описание КАК СТРОКА(1000))
		|		ИНАЧЕ ВЫРАЗИТЬ(ЕСТЬNULL(ЕСТЬNULL(ПредставленияОтчетовКонфигурации.Описание, ПредставленияОтчетовРасширений.Описание), ВариантыОтчетов.Описание) КАК СТРОКА(1000))
		|	КОНЕЦ КАК Описание,
		|	ВариантыОтчетов.Отчет,
		|	ВариантыОтчетов.ТипОтчета,
		|	ВариантыОтчетов.КлючВарианта,
		|	ВариантыОтчетов.Автор,
		|	ВЫБОР
		|		КОГДА ВариантыОтчетов.Родитель = ЗНАЧЕНИЕ(Справочник.ВариантыОтчетов.ПустаяСсылка)
		|			ТОГДА ЗНАЧЕНИЕ(Справочник.ВариантыОтчетов.ПустаяСсылка)
		|		КОГДА ВариантыОтчетов.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.ВариантыОтчетов.ПустаяСсылка)
		|			ТОГДА ВариантыОтчетов.Родитель
		|		ИНАЧЕ ВариантыОтчетов.Родитель.Родитель
		|	КОНЕЦ КАК Родитель,
		|	ВЫБОР
		|		КОГДА НЕ &ОтображатьВсеВариантыОтчетов
		|			ИЛИ ВариантыОтчетов.Назначение В (&НазначенияВариантовОтчетов)
		|			ТОГДА ИСТИНА
		|		ИНАЧЕ ЛОЖЬ
		|	КОНЕЦ КАК ВидимостьПоНазначению,
		|	ВариантыОтчетов.ПредопределенныйВариант.КлючЗамеров КАК КлючЗамеров
		|ПОМЕСТИТЬ втВарианты
		|ИЗ
		|	Справочник.ВариантыОтчетов.Размещение КАК РазмещениеОтчетов
		|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВариантыОтчетов КАК ВариантыОтчетов
		|			ПО ВариантыОтчетов.Ссылка = РазмещениеОтчетов.Ссылка
		|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВариантыОтчетов.Представления КАК ПредставленияОтчетов
		|			ПО ПредставленияОтчетов.Ссылка = ВариантыОтчетов.Ссылка
		|			И ПредставленияОтчетов.КодЯзыка = &КодЯзыка
		|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПредопределенныеВариантыОтчетов КАК ОтчетыКонфигурации
		|			ПО ОтчетыКонфигурации.Ссылка = ВариантыОтчетов.ПредопределенныйВариант
		|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПредопределенныеВариантыОтчетов.Представления КАК ПредставленияОтчетовКонфигурации
		|			ПО ПредставленияОтчетовКонфигурации.Ссылка = ВариантыОтчетов.ПредопределенныйВариант
		|			И ПредставленияОтчетовКонфигурации.КодЯзыка = &КодЯзыка
		|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПредопределенныеВариантыОтчетовРасширений КАК ОтчетыРасширений
		|			ПО ОтчетыРасширений.Ссылка = ВариантыОтчетов.ПредопределенныйВариант
		|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПредопределенныеВариантыОтчетовРасширений.Представления КАК ПредставленияОтчетовРасширений
		|			ПО ПредставленияОтчетовРасширений.Ссылка = ВариантыОтчетов.ПредопределенныйВариант
		|			И ПредставленияОтчетовРасширений.КодЯзыка = &КодЯзыка
		|ГДЕ
		|	(РазмещениеОтчетов.Ссылка В (&ВариантыНайденныеПоиском)
		|		ИЛИ (&НетОтбораПоПодсистемамИОтчетам
		|			ИЛИ РазмещениеОтчетов.Подсистема В (&ПодсистемыНайденныеПоиском)))
		|	И РазмещениеОтчетов.Подсистема В (&МассивПодсистем)
		|	И (НЕ ВариантыОтчетов.ТолькоДляАвтора
		|		ИЛИ ВариантыОтчетов.Автор = &ТекущийПользователь)
		|	И (&НетОтбораПоПодсистемамИОтчетам
		|		ИЛИ ВариантыОтчетов.Отчет В (&ОтчетыПользователя))
		|	И НЕ ВариантыОтчетов.ПредопределенныйВариант В (&ОтключенныеВариантыПрограммы)
		|	И (НЕ ВариантыОтчетов.Пользовательский
		|		ИЛИ НЕ ВариантыОтчетов.ИнтерактивнаяПометкаУдаления)
		|	И (ВариантыОтчетов.Пользовательский
		|		ИЛИ НЕ ВариантыОтчетов.ПометкаУдаления)
		|	И &Параметр1
		|";
		
	КонецЕсли;

	ОсновнойЗапрос = "
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
	|	ЕСТЬNULL(втВарианты.Ссылка, втПредопределенные.Ссылка) КАК Ссылка,
	|	ЕСТЬNULL(втВарианты.Подсистема, втПредопределенные.Подсистема) КАК Подсистема,
	|	ЕСТЬNULL(втВарианты.Важный, втПредопределенные.Важный) КАК Важный,
	|	ЕСТЬNULL(втВарианты.СмТакже, втПредопределенные.СмТакже) КАК СмТакже,
	|	ЕСТЬNULL(втВарианты.Наименование, втПредопределенные.Наименование) КАК Наименование,
	|	ЕСТЬNULL(втВарианты.Описание, втПредопределенные.Описание) КАК Описание,
	|	ЕСТЬNULL(втВарианты.Автор, втПредопределенные.Автор) КАК Автор,
	|	ЕСТЬNULL(втВарианты.Отчет, втПредопределенные.Отчет) КАК Отчет,
	|	ЕСТЬNULL(втВарианты.ТипОтчета, втПредопределенные.ТипОтчета) КАК ТипОтчета,
	|	ЕСТЬNULL(втВарианты.КлючВарианта, втПредопределенные.КлючВарианта) КАК КлючВарианта,
	|	ЕСТЬNULL(втВарианты.Родитель, втПредопределенные.Родитель) КАК Родитель,
	|	ЕСТЬNULL(втВарианты.ВидимостьПоНазначению, втПредопределенные.ВидимостьПоНазначению) КАК ВидимостьПоНазначению,
	|	ВЫБОР
	|		КОГДА ЕСТЬNULL(втВарианты.Родитель, втПредопределенные.Родитель) = ЗНАЧЕНИЕ(Справочник.ВариантыОтчетов.ПустаяСсылка)
	|		ТОГДА ИСТИНА
	|		ИНАЧЕ ЛОЖЬ
	|	КОНЕЦ КАК ВерхнийУровень,
	|	ЕСТЬNULL(втВарианты.КлючЗамеров, втПредопределенные.КлючЗамеров) КАК КлючЗамеров
	|ПОМЕСТИТЬ втВсеВариантыСПодсистемами
	|ИЗ
	|	втПредопределенные КАК втПредопределенные
	|		ПОЛНОЕ СОЕДИНЕНИЕ втВарианты КАК втВарианты
	|			ПО втПредопределенные.Ссылка = втВарианты.Ссылка
	|			И втПредопределенные.Подсистема = втВарианты.Подсистема
	|ГДЕ
	|	ЕСТЬNULL(втВарианты.Использование, ИСТИНА)
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
	|	ВариантыОтчетов.Ссылка КАК Ссылка,
	|	ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) КАК Подсистема,
	|	ЛОЖЬ КАК Важный,
	|	ЛОЖЬ КАК СмТакже,
	|	ВариантыОтчетов.Наименование КАК Наименование,
	|	ВЫРАЗИТЬ(ВариантыОтчетов.Описание КАК СТРОКА(1000)) КАК Описание,
	|	ВариантыОтчетов.Автор КАК Автор,
	|	ВариантыОтчетов.Отчет КАК Отчет,
	|	ВариантыОтчетов.ТипОтчета КАК ТипОтчета,
	|	ВариантыОтчетов.КлючВарианта КАК КлючВарианта,
	|	ВЫБОР
	|		КОГДА ВариантыОтчетов.Родитель = ЗНАЧЕНИЕ(Справочник.ВариантыОтчетов.ПустаяСсылка)
	|			ТОГДА ЗНАЧЕНИЕ(Справочник.ВариантыОтчетов.ПустаяСсылка)
	|		КОГДА ВариантыОтчетов.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.ВариантыОтчетов.ПустаяСсылка)
	|			ТОГДА ВариантыОтчетов.Родитель
	|		ИНАЧЕ ВариантыОтчетов.Родитель.Родитель
	|	КОНЕЦ КАК Родитель,
	|	ВЫБОР
	|		КОГДА НЕ &ОтображатьВсеВариантыОтчетов
	|				ИЛИ ВариантыОтчетов.Назначение В (&НазначенияВариантовОтчетов)
	|			ТОГДА ИСТИНА
	|		ИНАЧЕ ЛОЖЬ
	|	КОНЕЦ КАК ВидимостьПоНазначению,
	|	ВЫБОР
	|		КОГДА ВариантыОтчетов.Родитель = ЗНАЧЕНИЕ(Справочник.ВариантыОтчетов.ПустаяСсылка)
	|			ТОГДА ИСТИНА
	|		ИНАЧЕ ЛОЖЬ
	|	КОНЕЦ КАК ВерхнийУровень,
	|	ВариантыОтчетов.ПредопределенныйВариант.КлючЗамеров КАК КлючЗамеров
	|ПОМЕСТИТЬ втВсеВарианты
	|ИЗ
	|	Справочник.ВариантыОтчетов КАК ВариантыОтчетов
	|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВариантыОтчетов.Размещение КАК РазмещениеОтчетов
	|		ПО ВариантыОтчетов.Ссылка = РазмещениеОтчетов.Ссылка
	|		ЛЕВОЕ СОЕДИНЕНИЕ втВсеВариантыСПодсистемами КАК втВсеВариантыСПодсистемами
	|		ПО ВариантыОтчетов.Ссылка = втВсеВариантыСПодсистемами.Ссылка
	|ГДЕ
	|	(ВариантыОтчетов.Ссылка В (&ВариантыНайденныеПоиском)
	|			ИЛИ (&НетОтбораПоПодсистемамИОтчетам
	|				ИЛИ РазмещениеОтчетов.Подсистема В (&ПодсистемыНайденныеПоиском)))
	|	И (РазмещениеОтчетов.Ссылка ЕСТЬ NULL
	|			ИЛИ РазмещениеОтчетов.Подсистема В (&МассивПодсистем))
	|	И (НЕ ВариантыОтчетов.ТолькоДляАвтора
	|			ИЛИ ВариантыОтчетов.Автор = &ТекущийПользователь)
	|	И (&НетОтбораПоПодсистемамИОтчетам
	|			ИЛИ ВариантыОтчетов.Отчет В (&ОтчетыПользователя))
	|	И НЕ ВариантыОтчетов.ПредопределенныйВариант В (&ОтключенныеВариантыПрограммы)
	|	И (НЕ ВариантыОтчетов.Пользовательский
	|			ИЛИ НЕ ВариантыОтчетов.ИнтерактивнаяПометкаУдаления)
	|	И (ВариантыОтчетов.Пользовательский
	|			ИЛИ НЕ ВариантыОтчетов.ПометкаУдаления)
	|	И &Параметр1
	|	И втВсеВариантыСПодсистемами.Ссылка ЕСТЬ NULL
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ
	|	втВсеВариантыСПодсистемами.Ссылка,
	|	втВсеВариантыСПодсистемами.Подсистема,
	|	втВсеВариантыСПодсистемами.Важный,
	|	втВсеВариантыСПодсистемами.СмТакже,
	|	втВсеВариантыСПодсистемами.Наименование,
	|	втВсеВариантыСПодсистемами.Описание,
	|	втВсеВариантыСПодсистемами.Автор,
	|	втВсеВариантыСПодсистемами.Отчет,
	|	втВсеВариантыСПодсистемами.ТипОтчета,
	|	втВсеВариантыСПодсистемами.КлючВарианта,
	|	втВсеВариантыСПодсистемами.Родитель,
	|	втВсеВариантыСПодсистемами.ВидимостьПоНазначению,
	|	втВсеВариантыСПодсистемами.ВерхнийУровень,
	|	втВсеВариантыСПодсистемами.КлючЗамеров
	|ИЗ
	|	втВсеВариантыСПодсистемами КАК втВсеВариантыСПодсистемами
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////	
	|ВЫБРАТЬ
	|	Подсистемы.Ссылка КАК Подсистема,
	|	Подсистемы.РазделСсылка КАК РазделСсылка,
	|	Подсистемы.Представление КАК Представление,
	|	Подсистемы.Приоритет КАК Приоритет
	|ПОМЕСТИТЬ втПодсистемы
	|ИЗ
	|	&ТаблицаПодсистем КАК Подсистемы
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ РАЗРЕШЕННЫЕ
	|	втВсеВарианты.Ссылка КАК Ссылка,
	|	втВсеВарианты.Подсистема КАК Подсистема,
	|	втПодсистемы.Представление КАК ПодсистемаПредставление,
	|	ЕСТЬNULL(втПодсистемы.Приоритет, """") КАК ПодсистемаПриоритет,
	|	втПодсистемы.РазделСсылка КАК РазделСсылка,
	|	ВЫБОР
	|		КОГДА втВсеВарианты.Подсистема = втПодсистемы.РазделСсылка
	|			И втВсеВарианты.СмТакже = ЛОЖЬ
	|		ТОГДА ИСТИНА
	|		ИНАЧЕ ЛОЖЬ
	|	КОНЕЦ КАК БезГруппы,
	|	втВсеВарианты.Важный КАК Важный,
	|	втВсеВарианты.СмТакже КАК СмТакже,
	|	ВЫБОР
	|		КОГДА втВсеВарианты.ТипОтчета = ЗНАЧЕНИЕ(Перечисление.ТипыОтчетов.Дополнительный)
	|		ТОГДА ИСТИНА
	|		ИНАЧЕ ЛОЖЬ
	|	КОНЕЦ КАК Дополнительный,
	|	МАКСИМУМ(ЕСТЬNULL(НедоступныеВариантыОтчетов.Видимость, ЕСТЬNULL(ДоступныеВариантыОтчетов.Видимость, ЛОЖЬ))) КАК Видимость,
	|	МАКСИМУМ(ЕСТЬNULL(НедоступныеВариантыОтчетов.БыстрыйДоступ, ЕСТЬNULL(ДоступныеВариантыОтчетов.БыстрыйДоступ, ЛОЖЬ))) КАК БыстрыйДоступ,
	|	ВЫБОР
	|		КОГДА втВсеВарианты.ТипОтчета = ЗНАЧЕНИЕ(Перечисление.ТипыОтчетов.Внутренний)
	|				ИЛИ втВсеВарианты.ТипОтчета = ЗНАЧЕНИЕ(Перечисление.ТипыОтчетов.Расширение)
	|			ТОГДА втВсеВарианты.Отчет.Имя
	|		КОГДА втВсеВарианты.ТипОтчета = ЗНАЧЕНИЕ(Перечисление.ТипыОтчетов.Дополнительный)
	|			ТОГДА """"
	|		ИНАЧЕ ПОДСТРОКА(ВЫРАЗИТЬ(втВсеВарианты.Отчет КАК СТРОКА(150)), 14, 137)
	|	КОНЕЦ КАК ИмяОтчета,
	|	ЕСТЬNULL(втВсеВарианты.Наименование, """") КАК Наименование,
	|	втВсеВарианты.Описание КАК Описание,
	|	втВсеВарианты.Автор КАК Автор,
	|	втВсеВарианты.Отчет КАК Отчет,
	|	втВсеВарианты.ТипОтчета КАК ТипОтчета,
	|	втВсеВарианты.КлючВарианта КАК КлючВарианта,
	|	втВсеВарианты.Родитель КАК Родитель,
	|	втВсеВарианты.ВидимостьПоНазначению КАК ВидимостьПоНазначению,
	|	втВсеВарианты.ВерхнийУровень КАК ВерхнийУровень,
	|	втВсеВарианты.КлючЗамеров КАК КлючЗамеров
	|ИЗ
	|	втВсеВарианты КАК втВсеВарианты
	|		ЛЕВОЕ СОЕДИНЕНИЕ втПодсистемы КАК втПодсистемы
	|			ПО втВсеВарианты.Подсистема = втПодсистемы.Подсистема
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
	|			ПО СоставыГруппПользователей.Пользователь = &ТекущийПользователь
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НастройкиВариантовОтчетов КАК ДоступныеВариантыОтчетов
	|			ПО ДоступныеВариантыОтчетов.Вариант = втВсеВарианты.Ссылка
	|			И ДоступныеВариантыОтчетов.Подсистема В (
	|				втВсеВарианты.Подсистема,
	|				ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка))
	|			И ДоступныеВариантыОтчетов.Пользователь В (СоставыГруппПользователей.ГруппаПользователей, НЕОПРЕДЕЛЕНО)
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НастройкиВариантовОтчетов КАК НедоступныеВариантыОтчетов
	|			ПО НедоступныеВариантыОтчетов.Вариант = втВсеВарианты.Ссылка
	|			И НедоступныеВариантыОтчетов.Подсистема = втВсеВарианты.Подсистема
	|			И (НедоступныеВариантыОтчетов.Пользователь В (&ТекущийПользователь, НЕОПРЕДЕЛЕНО)
	|				ИЛИ ТИПЗНАЧЕНИЯ(&ТекущийПользователь) = ТИП(Справочник.Пользователи)
	|					И НедоступныеВариантыОтчетов.Пользователь = ЗНАЧЕНИЕ(Справочник.ГруппыПользователей.ВсеПользователи)
	|				ИЛИ ТИПЗНАЧЕНИЯ(&ТекущийПользователь) = ТИП(Справочник.ВнешниеПользователи)
	|					И НедоступныеВариантыОтчетов.Пользователь = ЗНАЧЕНИЕ(Справочник.ГруппыВнешнихПользователей.ВсеВнешниеПользователи))
	|			И НЕ НедоступныеВариантыОтчетов.Видимость
	|ГДЕ
	|	(&НетОтбораПоВидимости
	|		ИЛИ ДоступныеВариантыОтчетов.Видимость = ИСТИНА
	|			И НедоступныеВариантыОтчетов.Вариант ЕСТЬ NULL)
	|
	|СГРУППИРОВАТЬ ПО
	|	втВсеВарианты.Ссылка,
	|	втВсеВарианты.Подсистема,
	|	втПодсистемы.Представление,
	|	ЕСТЬNULL(втПодсистемы.Приоритет, """"),
	|	втПодсистемы.РазделСсылка,
	|	ВЫБОР
	|		КОГДА втВсеВарианты.Подсистема = втПодсистемы.РазделСсылка
	|			И втВсеВарианты.СмТакже = ЛОЖЬ
	|		ТОГДА ИСТИНА
	|		ИНАЧЕ ЛОЖЬ
	|	КОНЕЦ,
	|	втВсеВарианты.Важный,
	|	втВсеВарианты.СмТакже,
	|	ВЫБОР
	|		КОГДА втВсеВарианты.ТипОтчета = ЗНАЧЕНИЕ(Перечисление.ТипыОтчетов.Дополнительный)
	|		ТОГДА ИСТИНА
	|		ИНАЧЕ ЛОЖЬ
	|	КОНЕЦ,
	|	ВЫБОР
	|		КОГДА втВсеВарианты.ТипОтчета = ЗНАЧЕНИЕ(Перечисление.ТипыОтчетов.Внутренний)
	|				ИЛИ втВсеВарианты.ТипОтчета = ЗНАЧЕНИЕ(Перечисление.ТипыОтчетов.Расширение)
	|			ТОГДА втВсеВарианты.Отчет.Имя
	|		КОГДА втВсеВарианты.ТипОтчета = ЗНАЧЕНИЕ(Перечисление.ТипыОтчетов.Дополнительный)
	|			ТОГДА """"
	|		ИНАЧЕ ПОДСТРОКА(ВЫРАЗИТЬ(втВсеВарианты.Отчет КАК СТРОКА(150)), 14, 137)
	|	КОНЕЦ,
	|	ЕСТЬNULL(втВсеВарианты.Наименование, """"),
	|	втВсеВарианты.Описание,
	|	втВсеВарианты.Автор,
	|	втВсеВарианты.Отчет,
	|	втВсеВарианты.ТипОтчета,
	|	втВсеВарианты.КлючВарианта,
	|	втВсеВарианты.Родитель,
	|	втВсеВарианты.ВидимостьПоНазначению,
	|	втВсеВарианты.ВерхнийУровень,
	|	втВсеВарианты.КлючЗамеров
	|
	|УПОРЯДОЧИТЬ ПО
	|	ПодсистемаПриоритет,
	|	Наименование";
	
	Возврат ТекстЗапросаПредварительный + ОбщегоНазначения.РазделительПакетаЗапросов() + ОсновнойЗапрос;

КонецФункции

// Устанавливает имена отчетов по метаданным.
//
// Параметры:
//   ТаблицаРезультат - ТаблицаЗначений - коллекция найденных вариантов отчетов, где:
//       * ИмяОтчета - Строка - имя отчета, как оно указано в метаданных.
//       * Наименование - Строка - наименование варианта отчета.
//       * Отчет - СправочникСсылка.ИдентификаторыОбъектовРасширений
//               - СправочникСсылка.ДополнительныеОтчетыИОбработки
//               - СправочникСсылка.ИдентификаторыОбъектовМетаданных
//               - Строка - ссылка на идентификатор метаданных отчета.
//        * ТипОтчета - ПеречислениеСсылка.ТипыОтчетов - категория отчета.
//
Процедура ЗаполнитьИменаОтчетов(ТаблицаРезультат)
	
	ИдентификаторыОтчетов = Новый Массив;
	Для Каждого СтрокаОтчета Из ТаблицаРезультат Цикл
		Если Не СтрокаОтчета.Дополнительный Тогда
			ИдентификаторыОтчетов.Добавить(СтрокаОтчета.Отчет);
		КонецЕсли;
	КонецЦикла;
	ОбъектыОтчетов = ОбщегоНазначения.ОбъектыМетаданныхПоИдентификаторам(ИдентификаторыОтчетов, Ложь);
	НесуществующиеИНедоступные = Новый Массив;
	
	Для Каждого ОтчетДляВывода Из ТаблицаРезультат Цикл
		Если ОтчетДляВывода.ТипОтчета = Перечисления.ТипыОтчетов.Внутренний
			Или ОтчетДляВывода.ТипОтчета = Перечисления.ТипыОтчетов.Расширение Тогда
			МетаданныеОтчета = ОбъектыОтчетов[ОтчетДляВывода.Отчет]; // ОбъектМетаданныхОтчет
			Если МетаданныеОтчета = Неопределено Или МетаданныеОтчета = Null Тогда
				НесуществующиеИНедоступные.Добавить(ОтчетДляВывода);
			ИначеЕсли ОтчетДляВывода.ИмяОтчета <> МетаданныеОтчета.Имя Тогда
				ОтчетДляВывода.ИмяОтчета = МетаданныеОтчета.Имя;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	
	Для каждого НедоступныйОтчет Из НесуществующиеИНедоступные Цикл
		ТаблицаРезультат.Удалить(НедоступныйОтчет);
	КонецЦикла;
	
	ОтчетыНеименованные = ТаблицаРезультат.НайтиСтроки(Новый Структура("Наименование", "")); // Массив из СтрокаТаблицыЗначений
	Для Каждого ОписаниеОтчета Из ОтчетыНеименованные Цикл
		Если ЗначениеЗаполнено(ОписаниеОтчета.ИмяОтчета) Тогда 
			ОписаниеОтчета.Наименование = ОписаниеОтчета.ИмяОтчета;
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// Определение используемых таблиц.

// Регистрирует в массиве таблицы, используемые в наборах данных.
Процедура ЗарегистрироватьТаблицыНаборовДанных(Таблицы, НаборыДанных)
	Для Каждого Набор Из НаборыДанных Цикл
		Если ТипЗнч(Набор) = Тип("НаборДанныхЗапросСхемыКомпоновкиДанных") Тогда
			ЗарегистрироватьТаблицыЗапроса(Таблицы, Набор.Запрос);
		ИначеЕсли ТипЗнч(Набор) = Тип("НаборДанныхОбъединениеСхемыКомпоновкиДанных") Тогда
			ЗарегистрироватьТаблицыНаборовДанных(Таблицы, Набор.Элементы);
		ИначеЕсли ТипЗнч(Набор) = Тип("НаборДанныхОбъектСхемыКомпоновкиДанных") Тогда
			// Нечего регистрировать.
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры

// Регистрирует в массиве таблицы, используемые в запросе.
Процедура ЗарегистрироватьТаблицыЗапроса(Таблицы, ТекстЗапроса)
	Если Не ЗначениеЗаполнено(ТекстЗапроса) Тогда
		Возврат;
	КонецЕсли;
	СхемаЗапроса = Новый СхемаЗапроса;
	СхемаЗапроса.УстановитьТекстЗапроса(ТекстЗапроса);
	Для Каждого Запрос Из СхемаЗапроса.ПакетЗапросов Цикл
		Если ТипЗнч(Запрос) = Тип("ЗапросВыбораСхемыЗапроса") Тогда
			ЗарегистрироватьТаблицыОператоровЗапроса(Таблицы, Запрос.Операторы);
		ИначеЕсли ТипЗнч(Запрос) = Тип("ЗапросУничтоженияТаблицыСхемыЗапроса") Тогда
			// Нечего регистрировать.
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры

// Продолжение процедуры (см. выше).
Процедура ЗарегистрироватьТаблицыОператоровЗапроса(Таблицы, Операторы)
	Для Каждого Оператор Из Операторы Цикл
		Для Каждого Источник Из Оператор.Источники Цикл
			Источник = Источник.Источник;
			Если ТипЗнч(Источник) = Тип("ТаблицаСхемыЗапроса") Тогда
				Если Таблицы.Найти(Источник.ИмяТаблицы) = Неопределено Тогда
					Таблицы.Добавить(Источник.ИмяТаблицы);
				КонецЕсли;
			ИначеЕсли ТипЗнч(Источник) = Тип("ВложенныйЗапросСхемыЗапроса") Тогда
				ЗарегистрироватьТаблицыОператоровЗапроса(Таблицы, Источник.Запрос.Операторы);
			ИначеЕсли ТипЗнч(Источник) = Тип("ОписаниеВременнойТаблицыСхемыЗапроса") Тогда
				// Нечего регистрировать.
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;
КонецПроцедуры

// Возвращает текст сообщения о том, что данные отчета еще обновляются.
Функция СообщениеДанныеЕщеОбновляются() Экспорт
	Возврат НСтр("ru = 'Отчет может содержать некорректные данные, так как не завершен переход на новую версию программы. Если отчет долгое время недоступен, обратитесь к администратору.'");
КонецФункции

////////////////////////////////////////////////////////////////////////////////
// Подменю "Отчеты".

// Вызывается из ПриОпределенииКомандПодключенныхКОбъекту.
Процедура ПриДобавленииКомандОтчетов(Команды, СведенияОбОбъекте, НастройкиФормы)
	СведенияОбОбъекте.Менеджер.ДобавитьКомандыОтчетов(Команды, НастройкиФормы);
	ДобавленныеКоманды = Команды.НайтиСтроки(Новый Структура("Обработана", Ложь));
	Для Каждого Команда Из ДобавленныеКоманды Цикл
		Если Не ЗначениеЗаполнено(Команда.Менеджер) Тогда
			Команда.Менеджер = СведенияОбОбъекте.ПолноеИмя;
		КонецЕсли;
		Если Не ЗначениеЗаполнено(Команда.ТипПараметра) Тогда
			Если ТипЗнч(СведенияОбОбъекте.ТипСсылкиДанных) = Тип("Тип") Тогда
				Команда.ТипПараметра = Новый ОписаниеТипов(ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(СведенияОбОбъекте.ТипСсылкиДанных));
			Иначе // Тип("ОписаниеТипов") или Неопределено.
				Команда.ТипПараметра = СведенияОбОбъекте.ТипСсылкиДанных;
			КонецЕсли;
		КонецЕсли;
		Команда.Обработана = Истина;
	КонецЦикла;
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// Вспомогательные для служебного программного интерфейса

// Обработчик определения доступности отчетов конфигурации и расширений.
Процедура ПриОпределенииДоступностиОтчетов(СсылкиОтчетов, Результат)
	ИменаОтчетов = ОбщегоНазначения.ЗначениеРеквизитаОбъектов(СсылкиОтчетов, "Имя", Истина);
	Для Каждого Отчет Из СсылкиОтчетов Цикл
		ИмяОтчета = ИменаОтчетов[Отчет];
		ДоступенПоRLS = Истина;
		ДоступенПоПравам = Истина;
		ДоступенПоОпциям = Истина;
		НайденВПрограмме = Истина;
		Если ИмяОтчета = Неопределено Тогда
			ДоступенПоRLS = Ложь;
		Иначе
			ОтчетМетаданные = Метаданные.Отчеты.Найти(ИмяОтчета);
			Если ОтчетМетаданные = Неопределено Тогда
				НайденВПрограмме = Ложь;
			ИначеЕсли Не ПравоДоступа("Просмотр", ОтчетМетаданные) Тогда
				ДоступенПоПравам = Ложь;
			ИначеЕсли Не ОбщегоНазначения.ОбъектМетаданныхДоступенПоФункциональнымОпциям(ОтчетМетаданные) Тогда
				ДоступенПоОпциям = Ложь;
			КонецЕсли;
		КонецЕсли;
		Найденные = Результат.НайтиСтроки(Новый Структура("Отчет", Отчет));
		Для Каждого СтрокаТаблицы Из Найденные Цикл
			Если Не ДоступенПоRLS Тогда
				СтрокаТаблицы.Представление = НСтр("ru = '<Недостаточно прав для работы с вариантом отчета>'");
			ИначеЕсли Не НайденВПрограмме Тогда
				СтрокаТаблицы.Представление = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					НСтр("ru = '<Отчет ""%1"" не существует в программе>'"),
					ИмяОтчета);
			ИначеЕсли Не ДоступенПоПравам Тогда
				СтрокаТаблицы.Представление = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					НСтр("ru = '<Недостаточно прав для работы с отчетом ""%1"">'"),
					ИмяОтчета);
			ИначеЕсли Не ДоступенПоОпциям Тогда
				СтрокаТаблицы.Представление = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					НСтр("ru = '<Отчет ""%1"" отключен в настройках программы>'"),
					ИмяОтчета);
			Иначе
				СтрокаТаблицы.Доступен = Истина;
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;
КонецПроцедуры

// Определяет способ подключения общей формы отчета.
Функция ПоУмолчаниюВсеПодключеныКОсновнойФорме()
	ФормаМетаданные = Метаданные.ОсновнаяФормаОтчета;
	Возврат (ФормаМетаданные <> Неопределено И ФормаМетаданные = Метаданные.ОбщиеФормы.ФормаОтчета);
КонецФункции

// Определяет способ подключения общей формы настроек отчета.
Функция ПоУмолчаниюВсеПодключеныКФормеНастроек()
	ФормаМетаданные = Метаданные.ОсновнаяФормаНастроекОтчета;
	Возврат (ФормаМетаданные <> Неопределено И ФормаМетаданные = Метаданные.ОбщиеФормы.ФормаНастроекОтчета);
КонецФункции

// Определяет способ подключения хранилища вариантов отчетов.
Функция ПоУмолчаниюВсеПодключеныКХранилищу()
	МетаданныеХранилища = Метаданные.ХранилищеВариантовОтчетов; // ОбъектМетаданныхХранилищеНастроек
	
	Возврат (МетаданныеХранилища <> Неопределено И МетаданныеХранилища.Имя = "ХранилищеВариантовОтчетов");
КонецФункции

// Возвращает признак предопределенности варианта отчета.
//
// Параметры:
//  ВариантОтчета - СправочникОбъект.ВариантыОтчетов
//                - СправочникОбъект.ПредопределенныеВариантыОтчетов
//                - СправочникОбъект.ПредопределенныеВариантыОтчетовРасширений
//                - СправочникСсылка.ВариантыОтчетов
//                - СправочникСсылка.ПредопределенныеВариантыОтчетовРасширений
//                - СправочникСсылка.ПредопределенныеВариантыОтчетовРасширений
//                - Структура
//
// Возвращаемое значение:
//   Булево - если Истина, то вариант отчета является предопределенным.
//
Функция ЭтоПредопределенныйВариантОтчета(ВариантОтчета) Экспорт 
	
	ТипВариантаОтчета = ТипЗнч(ВариантОтчета);
	
	Если ТипВариантаОтчета = Тип("СправочникОбъект.ПредопределенныеВариантыОтчетов")
		Или ТипВариантаОтчета = Тип("СправочникОбъект.ПредопределенныеВариантыОтчетовРасширений")
		Или ТипВариантаОтчета = Тип("СправочникСсылка.ПредопределенныеВариантыОтчетов")
		Или ТипВариантаОтчета = Тип("СправочникСсылка.ПредопределенныеВариантыОтчетовРасширений") Тогда 
		
		Возврат Истина;
	КонецЕсли;
	
	СвойстваВариантаОтчета = Новый Структура("Пользовательский, ПредопределенныйВариант");
	ЗаполнитьЗначенияСвойств(СвойстваВариантаОтчета, ВариантОтчета);
	
	Возврат СвойстваВариантаОтчета.Пользовательский <> Истина
		И ЗначениеЗаполнено(СвойстваВариантаОтчета.ПредопределенныйВариант);
	
КонецФункции

////////////////////////////////////////////////////////////////////////////////
// Отборы.

// Устанавливает отборы по расширенной информации из структуры.
Процедура ДополнитьОтборыИзСтруктуры(Отбор, Структура, РежимОтображения = Неопределено) Экспорт
	Если РежимОтображения = Неопределено Тогда
		РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
	КонецЕсли;
	Для Каждого КлючИЗначение Из Структура Цикл
		ИмяПоля = КлючИЗначение.Ключ;
		ОтборПоля = КлючИЗначение.Значение;
		Тип = ТипЗнч(ОтборПоля);
		Если Тип = Тип("Структура") Тогда
			Условие = ВидСравненияКомпоновкиДанных[ОтборПоля.Вид];
			Значение = ОтборПоля.Значение;
		ИначеЕсли Тип = Тип("Массив") Тогда
			Условие = ВидСравненияКомпоновкиДанных.ВСписке;
			Значение = ОтборПоля;
		ИначеЕсли Тип = Тип("СписокЗначений") Тогда
			Условие = ВидСравненияКомпоновкиДанных.ВСписке;
			Значение = ОтборПоля.ВыгрузитьЗначения();
		ИначеЕсли Тип = Тип("ВидСравненияКомпоновкиДанных") Тогда
			Условие = ОтборПоля;
			Значение = Неопределено;
		Иначе
			Условие = ВидСравненияКомпоновкиДанных.Равно;
			Значение = ОтборПоля;
		КонецЕсли;
		ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора(
			Отбор,
			ИмяПоля,
			Значение,
			Условие,
			,
			Истина,
			РежимОтображения);
	КонецЦикла;
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// Обмен настройками вариантов отчетов

#Область ОбменНастройкамиМеждуИнформационнымиБазами

// Параметры:
//   ОписаниеФайлов - Массив из Структура:
//     * Хранение - Строка
//     * Имя - Строка
//
// Возвращаемое значение:
//   Массив из Структура:
//     * Ссылка - СправочникСсылка.ВариантыОтчетов
//     * ИмяОтчета - Строка
//     * Настройки - Неопределено
//                 - НастройкиКомпоновкиДанных
//     * КлючВарианта - Строка
//     * ПредставлениеВарианта - Строка
//     * КлючТекущихПользовательскихНастроек - Строка
//     * ПредставлениеТекущихПользовательскихНастроек - Строка
//     * ПользовательскиеНастройки - СписокЗначений
//     * Значение - Строка
//     * Представление - Строка
//     * ХранилищеПользовательскихНастроек - Соответствие из КлючИЗначение:
//         ** Ключ - Строка
//         ** Значение - ПользовательскиеНастройкиКомпоновкиДанных
//
Функция ОбновитьВариантыОтчетовИзФайлов(ОписаниеФайлов) Экспорт 
	
	ОписаниеВариантовОтчетов = Новый Массив;
	
	Для Каждого ОписаниеФайла Из ОписаниеФайлов Цикл 
		
		ОписаниеВариантаОтчета = ОписаниеВариантаОтчета(ОписаниеФайла);
		Ссылка = ОбновитьВариантОтчетаПоОписанию(ОписаниеВариантаОтчета); // @skip-check query-in-loop - По-объектная запись данных.
		ОписаниеВариантаОтчета.Вставить("Ссылка", Ссылка);
		
		ОписаниеВариантовОтчетов.Добавить(ОписаниеВариантаОтчета);
		
	КонецЦикла;
	
	Возврат ОписаниеВариантовОтчетов;
	
КонецФункции

// Параметры:
//   ОписаниеФайла - Структура:
//     * Хранение - Строка
//     * Имя - Строка
//   ВариантОтчетаОснование - СправочникСсылка.ВариантыОтчетов
//
// Возвращаемое значение:
//   см. ОписаниеВариантаОтчета
//
Функция ОбновитьВариантОтчетаИзФайла(ОписаниеФайла, ВариантОтчетаОснование) Экспорт 
	
	ОписаниеВариантаОтчета = ОписаниеВариантаОтчета(ОписаниеФайла);
	Ссылка = ОбновитьВариантОтчетаПоОписанию(ОписаниеВариантаОтчета, ВариантОтчетаОснование);
	ОписаниеВариантаОтчета.Вставить("Ссылка", Ссылка);
	Возврат ОписаниеВариантаОтчета;
	
КонецФункции

// Параметры:
//   ОписаниеФайла - Структура:
//     * Хранение - Строка
//     * Имя - Строка
//
// Возвращаемое значение:
//  Структура:
//    * ИмяОтчета - Строка
//    * Настройки - Неопределено
//                - НастройкиКомпоновкиДанных
//    * КлючВарианта - Строка
//    * ПредставлениеВарианта - Строка
//    * КлючТекущихПользовательскихНастроек - Строка
//    * ПредставлениеТекущихПользовательскихНастроек - Строка
//    * ПользовательскиеНастройки - СписокЗначений
//    * Значение - Строка
//    * Представление - Строка
//    * ХранилищеПользовательскихНастроек - Соответствие из КлючИЗначение
//    * Ключ - Строка
//    * Значение - ПользовательскиеНастройкиКомпоновкиДанных
//    * Ссылка - СправочникСсылка.ВариантыОтчетов
//
Функция ОписаниеВариантаОтчета(ОписаниеФайла)
	
	ИмяКаталога = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ФайловаяСистема.СоздатьВременныйКаталог());
	ИмяФайлаАрхива = ПолучитьИмяВременногоФайла("zip"); // АПК:441 Временные файлы удаляются процедурой УдалитьФайлыОписанияВариантаОтчета
	
	ДвоичныеДанные = ПолучитьИзВременногоХранилища(ОписаниеФайла.Хранение); // ДвоичныеДанные
	ДвоичныеДанные.Записать(ИмяФайлаАрхива);
	
	Архив = Новый ЧтениеZipФайла(ИмяФайлаАрхива);
	Архив.ИзвлечьВсе(ИмяКаталога);
	
	ОписаниеВариантаОтчета = ПрочитатьНастройкиВариантаОтчета(ИмяКаталога);
	
	Если ЗначениеЗаполнено(ОписаниеВариантаОтчета.ОписаниеОшибки) Тогда 
		
		УдалитьФайлыОписанияВариантаОтчета(ИмяКаталога, ИмяФайлаАрхива);
		ВызватьИсключение ОписаниеВариантаОтчета.ОписаниеОшибки;
		
	КонецЕсли;
	
	ОписаниеВариантаОтчета.Настройки = ДесериализованныеНастройки(ИмяКаталога + "Settings.xml");
	
	Счетчик = 0;
	
	Для Каждого ЭлементСписка Из ОписаниеВариантаОтчета.ПользовательскиеНастройки Цикл 
		
		Счетчик = Счетчик + 1;
		ИмяФайла = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ИмяКаталога + "UserSettings%1.xml", Счетчик);
		
		ОписаниеВариантаОтчета.ХранилищеПользовательскихНастроек.Вставить(
			ЭлементСписка.Значение, ДесериализованныеНастройки(ИмяФайла));
		
	КонецЦикла;
	
	УдалитьФайлыОписанияВариантаОтчета(ИмяКаталога, ИмяФайлаАрхива);
	
	Возврат ОписаниеВариантаОтчета;
	
КонецФункции

// Параметры:
//  ИмяКаталога - Строка
//
// Возвращаемое значение:
//   см. ОписаниеНастроекВариантаОтчета
//
Функция ПрочитатьНастройкиВариантаОтчета(ИмяКаталога)
	
	ОписаниеНастроек = ОписаниеНастроекВариантаОтчета();
	
	#Область ЧтениеФайлаОписанияНастроек
	
	ШапкаОписанияОшибки = НСтр("ru = 'Некорректный формат описания настроек:'") + Символы.ПС;
	
	ЧтениеXML = Новый ЧтениеXML;
	ИмяФайла = "SettingsDescription.xml";
	Попытка
		ЧтениеXML.ОткрытьФайл(ИмяКаталога + ИмяФайла);
	Исключение
		ОписаниеНастроек.ОписаниеОшибки = ШапкаОписанияОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'отсутствует файл %1.'"), ИмяФайла);
		Возврат ОписаниеНастроек;
	КонецПопытки;
	
	ПостроительDOM = Новый ПостроительDOM;
	ДокументDOM = ПостроительDOM.Прочитать(ЧтениеXML);
	
	ЧтениеXML.Закрыть();
	
	#КонецОбласти
	
	#Область ЧтениеОбщегоОписанияНастроек
	
	Если ДокументDOM.ДочерниеУзлы.Количество() = 0 Тогда 
		ОписаниеНастроек.ОписаниеОшибки = ШапкаОписанияОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'отсутствует элемент %1.'"), "SettingsDescription");
		Возврат ОписаниеНастроек;
	КонецЕсли;
	
	Элемент = ДокументDOM.ДочерниеУзлы.Элемент(0);
	
	ИмяЭлемента = "ReportName";
	ИмяОтчета = Элемент.Атрибуты.ПолучитьИменованныйЭлемент(ИмяЭлемента);
	Если ИмяОтчета = Неопределено Тогда 
		ОписаниеНастроек.ОписаниеОшибки = ШапкаОписанияОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'отсутствует атрибут %1.'"), ИмяЭлемента);
		Возврат ОписаниеНастроек;
	КонецЕсли;
	
	ОписаниеНастроек.ИмяОтчета = ИмяОтчета.Значение;	
	Состав = Элемент.ДочерниеУзлы;
	
	#КонецОбласти
	
	#Область ЧтениеОписанияОсновныхНастроек
	
	ИмяЭлемента = "Settings"; 
	Если Состав.Количество() = 0 Тогда 
		ОписаниеНастроек.ОписаниеОшибки = ШапкаОписанияОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'отсутствует элемент %1.'"), ИмяЭлемента);
		Возврат ОписаниеНастроек;
	КонецЕсли;
	
	Элемент = Состав.Элемент(0);
	
	ИмяАтрибута = "Key";
	КлючВарианта = Элемент.Атрибуты.ПолучитьИменованныйЭлемент(ИмяАтрибута);
	Если КлючВарианта = Неопределено Тогда 
		ОписаниеНастроек.ОписаниеОшибки = ШапкаОписанияОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'отсутствует атрибут %1 элемента %2.'"), ИмяАтрибута, ИмяЭлемента);
		Возврат ОписаниеНастроек;
	КонецЕсли;
	
	ОписаниеНастроек.КлючВарианта = КлючВарианта.Значение;
	ИмяАтрибута = "Presentation"; 
	ПредставлениеВарианта = Элемент.Атрибуты.ПолучитьИменованныйЭлемент(ИмяАтрибута);
	Если ПредставлениеВарианта = Неопределено Тогда 
		ОписаниеНастроек.ОписаниеОшибки = ШапкаОписанияОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'отсутствует атрибут %1 элемента %2.'"), ИмяАтрибута, ИмяЭлемента);
		Возврат ОписаниеНастроек;
	КонецЕсли;
	
	ОписаниеНастроек.ПредставлениеВарианта = ПредставлениеВарианта.Значение;
	
	#КонецОбласти
	
	#Область ЧтениеОписанияПользовательскихНастроек
	
	ГраницаСостава = Состав.Количество() - 1;
	Если ГраницаСостава <= 0 Тогда 
		Возврат ОписаниеНастроек;
	КонецЕсли;
	
	ИмяЭлемента = "UserSettings"; 
	Для Индекс = 1 По ГраницаСостава Цикл 
		
		Элемент = Состав.Элемент(Индекс);
		ИмяАтрибута = "Key";
		КлючНастроек = Элемент.Атрибуты.ПолучитьИменованныйЭлемент(ИмяАтрибута);
		Если КлючНастроек = Неопределено Тогда 
			ОписаниеНастроек.ОписаниеОшибки = ШапкаОписанияОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'отсутствует атрибут %1 элемента %2.'"), ИмяАтрибута, ИмяЭлемента);
			Возврат ОписаниеНастроек;
		КонецЕсли;
		
		ИмяАтрибута = "Presentation";
		ПредставлениеНастроек = Элемент.Атрибуты.ПолучитьИменованныйЭлемент(ИмяАтрибута);
		Если ПредставлениеНастроек = Неопределено Тогда 
			ОписаниеНастроек.ОписаниеОшибки = ШапкаОписанияОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'отсутствует атрибут %1 элемента %2.'"), ИмяАтрибута, ИмяЭлемента);			
			Возврат ОписаниеНастроек;
		КонецЕсли;
		
		ИмяАтрибута = "isCurrent";
		ЭтоТекущиеПредставление = Элемент.Атрибуты.ПолучитьИменованныйЭлемент(ИмяАтрибута);
		Если ЭтоТекущиеПредставление = Неопределено Тогда 
			ОписаниеНастроек.ОписаниеОшибки = ШапкаОписанияОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'отсутствует атрибут %1 элемента %2.'"), ИмяАтрибута, ИмяЭлемента);			
			Возврат ОписаниеНастроек;
		КонецЕсли;
		
		ЭтоТекущие = XMLЗначение(Тип("Булево"), ЭтоТекущиеПредставление.Значение);
		
		ОписаниеНастроек.ПользовательскиеНастройки.Добавить(
			КлючНастроек.Значение, ПредставлениеНастроек.Значение, ЭтоТекущие);
		
		Если ЭтоТекущие Тогда			
			ОписаниеНастроек.КлючТекущихПользовательскихНастроек = КлючНастроек.Значение;
			ОписаниеНастроек.ПредставлениеТекущихПользовательскихНастроек = ПредставлениеНастроек.Значение;
		КонецЕсли;
		
	КонецЦикла;
	
	#КонецОбласти
	
	Возврат ОписаниеНастроек;
	
КонецФункции

// Конструктор описания настроек отчета.
//
// Возвращаемое значение:
//   Структура - описание настроек отчета, где:
//       * ИмяОтчета - Строка - полное имя объекта метаданных отчета.
//       * Настройки - НастройкиКомпоновкиДанных
//                   - ПользовательскиеНастройкиКомпоновкиДанных
//                   - Неопределено - переданные настройки.
//       * КлючВарианта - Строка - идентификатор варианта отчета.
//       * ПредставлениеВарианта - Строка - представление варианта отчета.
//       * КлючТекущихПользовательскихНастроек - Строка - идентификатор текущих пользовательских настроек.
//       * ПредставлениеТекущихПользовательскихНастроек - Строка - представление текущих пользовательских настроек.
//       * ПользовательскиеНастройки - СписокЗначений - список пользовательских настроек, где:
//             * Значение - Строка - ключ пользовательских настроек.
//             * Представление - Строка - представление пользовательских настроек.
//       * ХранилищеПользовательскихНастроек - Соответствие из КлючИЗначение - список пользовательских настроек, где:
//             * Ключ - Строка - ключ пользовательских настроек.
//             * Значение - ПользовательскиеНастройкиКомпоновкиДанных - настройки.
//
Функция ОписаниеНастроекВариантаОтчета()
	
	ОписаниеНастроек = Новый Структура;
	
	ОписаниеНастроек.Вставить("ИмяОтчета", "");
	ОписаниеНастроек.Вставить("Настройки", Неопределено);
	ОписаниеНастроек.Вставить("КлючВарианта", "");
	ОписаниеНастроек.Вставить("ПредставлениеВарианта", "");
	ОписаниеНастроек.Вставить("КлючТекущихПользовательскихНастроек", "");
	ОписаниеНастроек.Вставить("ПредставлениеТекущихПользовательскихНастроек", "");
	ОписаниеНастроек.Вставить("ПользовательскиеНастройки", Новый СписокЗначений);
	ОписаниеНастроек.Вставить("ХранилищеПользовательскихНастроек", Новый Соответствие);
	ОписаниеНастроек.Вставить("ОписаниеОшибки", "");
	
	Возврат ОписаниеНастроек;
	
КонецФункции

Функция ДесериализованныеНастройки(ИмяФайла)
	
	ЧтениеXML = Новый ЧтениеXML;
	
	Попытка
		ЧтениеXML.ОткрытьФайл(ИмяФайла);
	Исключение
		ОписаниеИмениФайла = СтрРазделить(ИмяФайла, ПолучитьРазделительПути());
		
		ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Некорректный формат настроек: отсутствует файл %1'"),
			ОписаниеИмениФайла[ОписаниеИмениФайла.ВГраница()]);
	КонецПопытки;
	
	Возврат СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
	
КонецФункции

// Параметры:
//  ОписаниеВариантаОтчета - Структура:
//    * ОписаниеОшибки - Строка
//    * ХранилищеПользовательскихНастроек - Соответствие
//    * ПользовательскиеНастройки - СписокЗначений
//    * ПредставлениеТекущихПользовательскихНастроек - Строка
//    * КлючТекущихПользовательскихНастроек - Строка
//    * ПредставлениеВарианта - Строка
//    * КлючВарианта - Строка
//    * Настройки - Неопределено
//    * ИмяОтчета - Строка
//   ВариантОтчетаОснование - СправочникСсылка.ВариантыОтчетов
//
// Возвращаемое значение:
//  СправочникСсылка.ВариантыОтчетов
//
Функция ОбновитьВариантОтчетаПоОписанию(Знач ОписаниеВариантаОтчета, Знач ВариантОтчетаОснование = Неопределено)
	
	Если Не ВариантыОтчетовПовтИсп.ПравоДобавления() Тогда 
		ВызватьИсключение НСтр("ru = 'Недостаточно прав для выполнения операции.'");
	КонецЕсли;
	
	ИнформацияОбОтчете = ИнформацияОбОтчете(ОписаниеВариантаОтчета.ИмяОтчета, Истина);
	Автор = Пользователи.АвторизованныйПользователь();
	
	НачатьТранзакцию();
	
	Попытка
		Блокировка = Новый БлокировкаДанных;
		Блокировка.Добавить(Метаданные.Справочники.ВариантыОтчетов.ПолноеИмя());
		Блокировка.Заблокировать();
		
		ВариантОтчета = ПользовательскийВариантОтчета(ИнформацияОбОтчете.Отчет, ОписаниеВариантаОтчета.КлючВарианта, Автор);
		Если ЗначениеЗаполнено(ВариантОтчета.Ссылка) Тогда 
			
			Объект = ВариантОтчета.Ссылка.ПолучитьОбъект();
			Объект.Настройки = Новый ХранилищеЗначения(ОписаниеВариантаОтчета.Настройки);
			ПользователиВарианта = Новый СписокЗначений;
			РегистрыСведений.НастройкиВариантовОтчетов.ПрочитатьНастройкиДоступностиВариантаОтчета(
				Объект.Ссылка, ПользователиВарианта);
			
			Если ПользователиВарианта.НайтиПоЗначению(Автор) = Неопределено Тогда 
				ПользователиВарианта.Добавить(Автор);
			КонецЕсли;
			
			Объект.ДополнительныеСвойства.Вставить("ПользователиВарианта", ПользователиВарианта);
			
		Иначе
			
			Наименование = ДоступноеНаименованиеВариантаОтчета(
				ИнформацияОбОтчете.Отчет, ОписаниеВариантаОтчета.ПредставлениеВарианта);
			
			Если ВариантОтчета.КлючВариантаЗанят Тогда 
				ОписаниеВариантаОтчета.КлючВарианта = Строка(Новый УникальныйИдентификатор());
			КонецЕсли;
			
			Если ВариантОтчетаОснование = Неопределено Тогда
				ВариантОтчетаОснование = ВариантОтчета(ИнформацияОбОтчете.Отчет, ОписаниеВариантаОтчета.КлючВарианта);
			КонецЕсли;
			
			ДанныеЗаполнения = Новый Структура;
			ДанныеЗаполнения.Вставить("Отчет", ИнформацияОбОтчете.Отчет);
			ДанныеЗаполнения.Вставить("КлючВарианта", ОписаниеВариантаОтчета.КлючВарианта);
			ДанныеЗаполнения.Вставить("Настройки", ОписаниеВариантаОтчета.Настройки);
			ДанныеЗаполнения.Вставить("Наименование", Наименование);
			ДанныеЗаполнения.Вставить("Автор", Автор);
			ДанныеЗаполнения.Вставить("Основание", ВариантОтчетаОснование);
			
			Объект = Справочники.ВариантыОтчетов.СоздатьЭлемент();
			Объект.Заполнить(ДанныеЗаполнения);
			
		КонецЕсли;
		
		Объект.Записать();
		СохранитьПользовательскиеНастройкиИзФайла(Объект.Ссылка, ОписаниеВариантаОтчета);
		
		ЗафиксироватьТранзакцию();
	Исключение
		ОтменитьТранзакцию();
		ВызватьИсключение;
	КонецПопытки;
	
	Возврат Объект.Ссылка;
	
КонецФункции

Процедура СохранитьПользовательскиеНастройкиИзФайла(ВариантОтчета, ОписаниеВариантаОтчета)
	
	Если ОписаниеВариантаОтчета.ПользовательскиеНастройки.Количество() = 0 Тогда 
		Возврат;
	КонецЕсли;
	
	ШаблонОписанияНастроек = Новый Структура("КлючОбъекта, КлючНастроек, Представление, Пользователь");
	ШаблонОписанияНастроек.КлючОбъекта = ОписаниеВариантаОтчета.ИмяОтчета + "/" + ОписаниеВариантаОтчета.КлючВарианта;
	ШаблонОписанияНастроек.Пользователь = ИмяПользователя();
	
	Для Каждого ЭлементСписка Из ОписаниеВариантаОтчета.ПользовательскиеНастройки Цикл 
		
		ОписаниеНастроек = Новый ОписаниеНастроек;
		ЗаполнитьЗначенияСвойств(ОписаниеНастроек, ШаблонОписанияНастроек);
		ОписаниеНастроек.КлючНастроек = ЭлементСписка.Значение;
		ОписаниеНастроек.Представление = ЭлементСписка.Представление;
		
		Настройки = ОписаниеВариантаОтчета.ХранилищеПользовательскихНастроек[ОписаниеНастроек.КлючНастроек];
		
		ХранилищеПользовательскихНастроекОтчетов.Сохранить(
			ОписаниеНастроек.КлючОбъекта,
			ОписаниеНастроек.КлючНастроек,
			Настройки,
			ОписаниеНастроек,
			ОписаниеНастроек.Пользователь);
		
	КонецЦикла;
	
	Если Не ЗначениеЗаполнено(ОписаниеВариантаОтчета.КлючТекущихПользовательскихНастроек) Тогда 
		Возврат;
	КонецЕсли;
	
	ОписаниеНастроек = Новый ОписаниеНастроек;
	ЗаполнитьЗначенияСвойств(ОписаниеНастроек, ШаблонОписанияНастроек);
	ОписаниеНастроек.КлючОбъекта = ОписаниеНастроек.КлючОбъекта + "/ТекущиеПользовательскиеНастройки";
	ОписаниеНастроек.КлючНастроек = ОписаниеВариантаОтчета.КлючТекущихПользовательскихНастроек;
	ОписаниеНастроек.Представление = ОписаниеВариантаОтчета.ПредставлениеТекущихПользовательскихНастроек;
	
	Настройки = ОписаниеВариантаОтчета.ХранилищеПользовательскихНастроек[ОписаниеНастроек.КлючНастроек];
	
	ОбщегоНазначения.ХранилищеСистемныхНастроекСохранить(
		ОписаниеНастроек.КлючОбъекта,
		ОписаниеНастроек.КлючНастроек,
		Настройки,
		ОписаниеНастроек,
		ОписаниеНастроек.Пользователь);
	
КонецПроцедуры

Функция ПользовательскийВариантОтчета(Отчет, КлючВарианта, Автор)
	
	ВариантОтчета = Новый Структура("Ссылка, КлючВариантаЗанят");
	
	#Область ЗапросПользовательскогоВариантаОтчета
	
	Запрос = Новый Запрос(
	"ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
	|	Отчеты.Ссылка,
	|	Отчеты.ПометкаУдаления
	|ИЗ
	|	Справочник.ВариантыОтчетов КАК Отчеты
	|ГДЕ
	|	ТИПЗНАЧЕНИЯ(&Отчет) <> ТИП(Справочник.ИдентификаторыОбъектовРасширений)
	|	И Отчеты.Отчет = &Отчет
	|	И Отчеты.КлючВарианта = &КлючВарианта
	|	И Отчеты.Автор = &Автор
	|	И Отчеты.Пользовательский
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ ПЕРВЫЕ 1
	|	Отчеты.Ссылка,
	|	Отчеты.ПометкаУдаления
	|ИЗ
	|	Справочник.ВариантыОтчетов КАК Отчеты
	|	ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПредопределенныеВариантыОтчетовВерсийРасширений КАК ОтчетыРасширений
	|		ПО ОтчетыРасширений.Вариант = Отчеты.ПредопределенныйВариант
	|		И ОтчетыРасширений.Отчет = Отчеты.Отчет
	|		И ОтчетыРасширений.КлючВарианта = Отчеты.КлючВарианта
	|ГДЕ
	|	ТИПЗНАЧЕНИЯ(&Отчет) = ТИП(Справочник.ИдентификаторыОбъектовРасширений)
	|	И Отчеты.Отчет = &Отчет
	|	И Отчеты.КлючВарианта = &КлючВарианта
	|	И Отчеты.Автор = &Автор
	|	И Отчеты.Пользовательский
	|	И ОтчетыРасширений.ВерсияРасширений = &ВерсияРасширений
	|
	|УПОРЯДОЧИТЬ ПО
	|	Отчеты.ПометкаУдаления УБЫВ
	|;
	|
	|ВЫБРАТЬ
	|	ИСТИНА В (
	|		ВЫБРАТЬ ПЕРВЫЕ 1
	|			ИСТИНА
	|		ИЗ
	|			Справочник.ВариантыОтчетов КАК ОтчетыИдентичные
	|		ГДЕ
	|			ОтчетыИдентичные.Отчет = &Отчет
	|			И ОтчетыИдентичные.КлючВарианта = &КлючВарианта
	|	) КАК КлючВариантаЗанят");
	
	Запрос.УстановитьПараметр("Отчет", Отчет);
	Запрос.УстановитьПараметр("КлючВарианта", КлючВарианта);
	Запрос.УстановитьПараметр("Автор", Автор);
	Запрос.УстановитьПараметр("ВерсияРасширений", ПараметрыСеанса.ВерсияРасширений);
	
	РезультатыЗапроса = Запрос.ВыполнитьПакет(); // Массив из РезультатЗапроса
	
	#КонецОбласти
	
	Для Каждого Результат Из РезультатыЗапроса Цикл 
		
		Выборка = Результат.Выбрать(); // ВыборкаИзРезультатаЗапроса
		Выборка.Следующий();
		
		ЗаполнитьЗначенияСвойств(ВариантОтчета, Выборка);
		
	КонецЦикла;
	
	Возврат ВариантОтчета;
	
КонецФункции

Функция ДоступноеНаименованиеВариантаОтчета(Отчет, Знач Наименование)
	
	Запрос = Новый Запрос(
	"ВЫБРАТЬ РАЗРЕШЕННЫЕ
	|	ВариантыОтчетов.Наименование
	|ИЗ
	|	Справочник.ВариантыОтчетов КАК ВариантыОтчетов
	|ГДЕ
	|	ВариантыОтчетов.Отчет = &Отчет
	|	И ВариантыОтчетов.Наименование ПОДОБНО &ШаблонНаименования СПЕЦСИМВОЛ ""~""");
	
	Запрос.УстановитьПараметр("Отчет", Отчет);
	Запрос.УстановитьПараметр("ШаблонНаименования", 
		ОбщегоНазначения.СформироватьСтрокуДляПоискаВЗапросе(Наименование) + "%");
	
	Результат = Запрос.Выполнить();	
	Если Результат.Пустой() Тогда 
		Возврат Наименование;
	КонецЕсли;
	
	НаименованияЗанятые = Результат.Выбрать();	
	Если Не НаименованияЗанятые.НайтиСледующий(Наименование, "Наименование") Тогда 
		Возврат Наименование;
	КонецЕсли;
	
	НаименованияЗанятые.Сбросить();
	
	ШаблонСчетчикаКопий = " (%1)";
	ШаблонНаименования = ШаблонНаименованияВариантаОтчета(НаименованияЗанятые, Наименование, ШаблонСчетчикаКопий);
	
	Если Не СтрЗаканчиваетсяНа(ШаблонНаименования, ШаблонСчетчикаКопий) Тогда 
		Возврат ШаблонНаименования;
	КонецЕсли;
	
	МаксимальноеКоличествоКопий = НаименованияЗанятые.Количество();	
	Для НомерКопии = 1 По МаксимальноеКоличествоКопий Цикл 
		Наименование = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонНаименования, НомерКопии);
		
		Если Не НаименованияЗанятые.НайтиСледующий(Наименование, "Наименование") Тогда 
			Возврат Наименование;
		КонецЕсли;
		
		НаименованияЗанятые.Сбросить();
	КонецЦикла;
	
	Возврат Наименование;
	
КонецФункции

Функция ШаблонНаименованияВариантаОтчета(НаименованияЗанятые, Знач Наименование, ШаблонСчетчикаКопий)
	
	ПризнакКопии = " - " + НСтр("ru = 'копия'");
	
	Если СтрЗаканчиваетсяНа(Наименование, ПризнакКопии) Тогда 
		Возврат Наименование + ШаблонСчетчикаКопий;
	КонецЕсли;
	
	ПозицияПризнакаКопии = СтрНайти(Наименование, ПризнакКопии);
	
	Если ПозицияПризнакаКопии > 0 Тогда 
		Возврат Сред(Наименование, 1, ПозицияПризнакаКопии - 1) + ШаблонСчетчикаКопий;
	КонецЕсли;
	
	Наименование = Наименование + ПризнакКопии;
	
	Если Не НаименованияЗанятые.НайтиСледующий(Наименование, "Наименование") Тогда 
		Возврат Наименование;
	КонецЕсли;
	
	НаименованияЗанятые.Сбросить();
	
	Возврат Наименование + ШаблонСчетчикаКопий;
	
КонецФункции

Процедура УдалитьФайлыОписанияВариантаОтчета(ИмяКаталога, ИмяФайлаАрхива)
	
	ФайловаяСистема.УдалитьВременныйКаталог(ИмяКаталога);
	ФайловаяСистема.УдалитьВременныйФайл(ИмяФайлаАрхива);
	
КонецПроцедуры

#КонецОбласти

#Область ОбменПользовательскимиНастройкамиВРамкахИнформационнойБазы

// Параметры:
//   ВыбранныеПользователи - СписокЗначений:
//     * Значение - СправочникСсылка.Пользователи
//                - СправочникСсылка.ГруппыПользователей
//                - СправочникСсылка.ГруппыВнешнихПользователей
//  ШаблонОписанияНастроек - Структура - параметры открытия формы выбора пользователей, (групп) пользователей, где:
//      * Настройки - ПользовательскиеНастройкиКомпоновкиДанных - настройки, которыми обмениваются.
//      * ВариантОтчета - СправочникСсылка.ВариантыОтчетов - ссылка на хранилище свойств варианта отчета.
//      * КлючОбъекта - Строка - измерение хранения настроек.
//      * КлючНастроек - Строка - измерение - идентификатор пользовательских настроек.
//      * Представление - Строка - наименование пользовательских настроек.
//      * ВариантМодифицирован - Булево - признак того, что вариант отчета изменен.
//
Процедура ПоделитьсяПользовательскимиНастройками(ВыбранныеПользователи, ШаблонОписанияНастроек) Экспорт 
	
	УстановитьПривилегированныйРежим(Истина);
	
	ТекущийПользователь = Пользователи.АвторизованныйПользователь();
	СвойстваПользователей = СвойстваПользователейНастроек(ВыбранныеПользователи, ТекущийПользователь);
	
	Если СвойстваПользователей.Действительных.Количество() = 0 Тогда 
		
		ШаблонОписанияНастроек.Вставить("Предупреждение", НСтр("ru = 'Выбранные пользователи недействительны'"));
		Возврат;
		
	КонецЕсли;
	
	Если СвойстваПользователей.Недействительных.Количество() > 0 Тогда 
		
		ШаблонПояснения = НСтр("ru = 'Некоторые из выбранных пользователей недействительны: %1'");
		
		Пояснение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			ШаблонПояснения, СтрСоединить(СвойстваПользователей.Недействительных, ", "));
		
		ШаблонОписанияНастроек.Вставить("Пояснение", Пояснение);
		
	КонецЕсли;
	
	ПроверитьДоступностьВариантаОтчета(ШаблонОписанияНастроек.ВариантОтчета, ВыбранныеПользователи);
	
	НормализоватьШаблонОписанияНастроек(ШаблонОписанияНастроек, ТекущийПользователь);
	
	СписокПользователей = Новый Массив;
	Для Каждого СвойстваПользователя Из СвойстваПользователей.Действительных Цикл 
		ОписаниеНастроек = Новый ОписаниеНастроек;
		ЗаполнитьЗначенияСвойств(ОписаниеНастроек, ШаблонОписанияНастроек);
		ОписаниеНастроек.Пользователь = СвойстваПользователя.Имя;
		
		ХранилищеПользовательскихНастроекОтчетов.Сохранить(
			ОписаниеНастроек.КлючОбъекта,
			ОписаниеНастроек.КлючНастроек,
			ШаблонОписанияНастроек.Настройки,
			ОписаниеНастроек,
			ОписаниеНастроек.Пользователь);
		
		СписокПользователей.Добавить(СвойстваПользователя.Ссылка); 
	КонецЦикла;
	
	НастройкиПользователей = ПользовательскиеНастройкиВариантаОтчета(
		ШаблонОписанияНастроек.ВариантОтчета, СписокПользователей, ШаблонОписанияНастроек.КлючНастроек);
	
	Для Каждого Пользователь Из СписокПользователей Цикл
		НастройкиПользователя = НастройкиПользователей.НайтиСтроки(Новый Структура("Пользователь", Пользователь));
		ОбновитьСлужебнуюИнформациюПользовательскихНастроек(Пользователь, ШаблонОписанияНастроек, НастройкиПользователя);
	КонецЦикла;

	ОповеститьПользователейНастроекОтчета(СвойстваПользователей.Действительных, ШаблонОписанияНастроек);
	
КонецПроцедуры

// Параметры:
//  ВыбранныеПользователи - СписокЗначений:
//    * Значение - СправочникСсылка.Пользователи
//               - СправочникСсылка.ГруппыПользователей
//               - СправочникСсылка.ГруппыВнешнихПользователей
//  ТекущийПользователь - СправочникСсылка.ВнешниеПользователи
//                      - СправочникСсылка.Пользователи
//
// Возвращаемое значение:
//  Структура:
//    * Недействительных - Массив из Структура
//    * Действительных - Массив из Структура
//
Функция СвойстваПользователейНастроек(ВыбранныеПользователи, ТекущийПользователь)
	
	СвойстваПользователей = Новый Структура();
	СвойстваПользователей.Вставить("Действительных", Новый Массив);
	СвойстваПользователей.Вставить("Недействительных", Новый Массив);
	
	#Область ЗапросПользователей
	
	ИспользоватьГруппыПользователей = ПолучитьФункциональнуюОпцию("ИспользоватьГруппыПользователей");
	
	// АПК:96 -выкл результат должен содержать уникальные значения
	
	Запрос = Новый Запрос(
	"ВЫБРАТЬ РАЗРЕШЕННЫЕ
	|	Пользователи.Ссылка,
	|	Пользователи.Представление,
	|	Пользователи.ИдентификаторПользователяИБ
	|ИЗ
	|	Справочник.Пользователи КАК Пользователи
	|ГДЕ
	|	Пользователи.Ссылка В (&ВыбранныеПользователи)
	|	И Пользователи.Ссылка <> &ТекущийПользователь
	|	И НЕ Пользователи.ПометкаУдаления
	|	И НЕ Пользователи.Недействителен
	|	И НЕ Пользователи.Служебный
	|
	|ОБЪЕДИНИТЬ
	|
	|ВЫБРАТЬ
	|	Пользователи.Ссылка,
	|	Пользователи.Представление,
	|	Пользователи.ИдентификаторПользователяИБ
	|ИЗ
	|	Справочник.ГруппыПользователей.Состав КАК СоставыГруппПользователей
	|	ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Пользователи КАК Пользователи
	|		ПО Пользователи.Ссылка = СоставыГруппПользователей.Пользователь
	|ГДЕ
	|	&ИспользоватьГруппыПользователей
	|	И СоставыГруппПользователей.Ссылка В (&ВыбранныеПользователи)
	|	И Пользователи.Ссылка <> &ТекущийПользователь
	|	И НЕ Пользователи.ПометкаУдаления
	|	И НЕ Пользователи.Недействителен
	|	И НЕ Пользователи.Служебный");
	
	// АПК:96 -вкл
	
	Запрос.УстановитьПараметр("ВыбранныеПользователи", ВыбранныеПользователи);
	Запрос.УстановитьПараметр("ТекущийПользователь", ТекущийПользователь);
	Запрос.УстановитьПараметр("ИспользоватьГруппыПользователей", ИспользоватьГруппыПользователей);
	
	Выборка = Запрос.Выполнить().Выбрать();
	
	#КонецОбласти
	
	Пока Выборка.Следующий() Цикл 
		
		ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(
			Выборка.ИдентификаторПользователяИБ);
		
		Если ПользовательИБ = Неопределено Тогда 
			
			СвойстваПользователей.Недействительных.Добавить(Выборка.Представление);
			Продолжить;
			
		КонецЕсли;
		
		СвойстваПользователя = СвойстваПользователя(Выборка.Ссылка, ПользовательИБ.Имя, Выборка.ИдентификаторПользователяИБ);
		СвойстваПользователей.Действительных.Добавить(СвойстваПользователя);
		
	КонецЦикла;
	
	Возврат СвойстваПользователей;
	
КонецФункции

// Параметры:
//  Ссылка - СправочникСсылка.Пользователи
//         - СправочникСсылка.ВнешниеПользователи
//  ИмяПользователяИБ - Строка
//  ИдентификаторПользователяИБ - УникальныйИдентификатор
//
// Возвращаемое значение:
//  Структура:
//    * Ссылка - СправочникСсылка.Пользователи
//             - СправочникСсылка.ВнешниеПользователи
//    * Имя - Строка
//    * ИдентификаторПользователяИБ - УникальныйИдентификатор
//
Функция СвойстваПользователя(Ссылка, ИмяПользователяИБ, ИдентификаторПользователяИБ)
	
	СвойстваПользователя = Новый Структура;
	СвойстваПользователя.Вставить("Ссылка", Ссылка);
	СвойстваПользователя.Вставить("Имя", ИмяПользователяИБ);
	СвойстваПользователя.Вставить("ИдентификаторПользователяИБ", ИдентификаторПользователяИБ);
	
	Возврат СвойстваПользователя;
	
КонецФункции

Процедура ПроверитьДоступностьВариантаОтчета(ВариантОтчета, ВыбранныеПользователи)
	
	ВыборкаПользователей = РегистрыСведений.НастройкиВариантовОтчетов.ПользователиВариантаОтчета(
		ВариантОтчета, ВыбранныеПользователи);
	
	Пока ВыборкаПользователей.Следующий() Цикл 
		
		НайденныйПользователь = ВыбранныеПользователи.Найти(ВыборкаПользователей.Ссылка);
		Если НайденныйПользователь <> Неопределено Тогда 
			ВыбранныеПользователи.Удалить(НайденныйПользователь);
		КонецЕсли;
		
	КонецЦикла;
	
	Если ВыбранныеПользователи.Количество() = 0
	 Или Не ПолныеПраваНаВарианты() Тогда
		Возврат;
	КонецЕсли;
	
	ВключитьБизнесЛогику = Не ОбновлениеИнформационнойБазы.ВыполняетсяОбновлениеИнформационнойБазы();
	
	НаборЗаписей = РегистрыСведений.НастройкиВариантовОтчетов.СоздатьНаборЗаписей();
	Подсистема = Справочники.ИдентификаторыОбъектовМетаданных.ПустаяСсылка();
	
	НаборЗаписей.Отбор.Вариант.Установить(ВариантОтчета);
	НаборЗаписей.Отбор.Подсистема.Установить(Подсистема);
	
	Для Каждого Пользователь Из ВыбранныеПользователи Цикл 
		Блокировка = Новый БлокировкаДанных;
		ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.НастройкиВариантовОтчетов");
		ЭлементБлокировки.УстановитьЗначение("Вариант", ВариантОтчета);
		ЭлементБлокировки.УстановитьЗначение("Пользователь", Пользователь);
		ЭлементБлокировки.УстановитьЗначение("Подсистема", Подсистема);
		
		НаборЗаписей.Отбор.Пользователь.Установить(Пользователь);
		
		НачатьТранзакцию();
		Попытка
			Блокировка.Заблокировать();
			НаборЗаписей.Прочитать();
			
			Если НаборЗаписей.Количество() = 0 Тогда
				Запись = НаборЗаписей.Добавить();
				Запись.Вариант = ВариантОтчета;
				Запись.Пользователь = Пользователь;
				Запись.Подсистема = Подсистема;
			Иначе
				Запись = НаборЗаписей[0];
			КонецЕсли;
			
			Если Не Запись.Видимость Тогда
				Запись.Видимость = Истина;
				ОбновлениеИнформационнойБазы.ЗаписатьНаборЗаписей(НаборЗаписей, , , ВключитьБизнесЛогику);	
			КонецЕсли;
			
			ЗафиксироватьТранзакцию();
		Исключение
			ОтменитьТранзакцию();
			ВызватьИсключение;
		КонецПопытки;
		
	КонецЦикла;
	
	
КонецПроцедуры

Процедура НормализоватьШаблонОписанияНастроек(ШаблонОписанияНастроек, ТекущийПользователь)
	
	УстановитьПредставлениеПользовательскихНастроек(ШаблонОписанияНастроек, ТекущийПользователь);
	
	Если ЗначениеЗаполнено(ШаблонОписанияНастроек.КлючНастроек) Тогда 
		Возврат;
	КонецЕсли;
	
	ШаблонОписанияНастроек.КлючНастроек = Строка(Новый УникальныйИдентификатор());
	
	Если ШаблонОписанияНастроек.ВариантМодифицирован Тогда 
		Возврат;
	КонецЕсли;
	
	ОбщегоНазначения.ХранилищеСистемныхНастроекСохранить(
		ШаблонОписанияНастроек.КлючОбъекта + "/ТекущиеПользовательскиеНастройки",
		"",
		ШаблонОписанияНастроек.Настройки);
	
КонецПроцедуры

Процедура УстановитьПредставлениеПользовательскихНастроек(ШаблонОписанияНастроек, ТекущийПользователь)
	
	ПользовательскиеНастройки = ПользовательскиеНастройкиВариантаОтчета(
		ШаблонОписанияНастроек.ВариантОтчета, ТекущийПользователь, ШаблонОписанияНастроек.КлючНастроек);
	
	Если ПользовательскиеНастройки <> Неопределено
		И ПользовательскиеНастройки.Количество() > 0 Тогда 
		
		ОписаниеНастройки = ПользовательскиеНастройки[0]; // см. ПользовательскиеНастройкиВариантаОтчета
		ШаблонОписанияНастроек.Представление = ОписаниеНастройки.Наименование;
		
		Возврат;
		
	КонецЕсли;
	
	ШаблонПредставления = НСтр("ru = 'Настройки %1'");
	ПредставлениеПользователя = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ТекущийПользователь, "Представление");
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.СклонениеПредставленийОбъектов") Тогда
		МодульСклонениеПредставленийОбъектов = ОбщегоНазначения.ОбщийМодуль("СклонениеПредставленийОбъектов");
		
		ПредставлениеПользователя = МодульСклонениеПредставленийОбъектов.ПросклонятьПредставление(
			ПредставлениеПользователя, 2, ТекущийПользователь);
	КонецЕсли;
	
	ШаблонОписанияНастроек.Представление = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		ШаблонПредставления, ПредставлениеПользователя);
	
КонецПроцедуры

Процедура ОбновитьСлужебнуюИнформациюПользовательскихНастроек(Пользователь, ОписаниеНастроек, Настройки)
	
	Если Не ЗначениеЗаполнено(Настройки) Тогда 
		
		Объект = Справочники.ПользовательскиеНастройкиОтчетов.СоздатьЭлемент();
		Объект.Наименование = ОписаниеНастроек.Представление;
		Объект.КлючПользовательскойНастройки = ОписаниеНастроек.КлючНастроек;
		Объект.Вариант = ОписаниеНастроек.ВариантОтчета;
		Объект.Пользователь = Пользователь;
		Объект.Записать(); // АПК:1327
		Возврат;
		
	КонецЕсли;
	
	Элемент = Настройки[0];
	
	Если Не Элемент.ПометкаУдаления
		И Элемент.Наименование = ОписаниеНастроек.Представление Тогда
		
		Возврат;
	КонецЕсли;
	
	Объект = Элемент.Ссылка.ПолучитьОбъект(); // СправочникОбъект.ПользовательскиеНастройкиВариантов
	Объект.Наименование = ОписаниеНастроек.Представление;
	Объект.ПометкаУдаления = Ложь;
	Объект.Записать(); // АПК:1327
	
КонецПроцедуры

Процедура ОповеститьПользователейНастроекОтчета(СвойстваПользователей, ОписаниеНастроек)
	
	#Область Проверка
	
	Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Обсуждения") Тогда
		Возврат;
	КонецЕсли;
	
	МодульОбсужденияСлужебный = ОбщегоНазначения.ОбщийМодуль("ОбсужденияСлужебный");
	МодульОбсуждения = ОбщегоНазначения.ОбщийМодуль("Обсуждения");
	
	Если Не МодульОбсужденияСлужебный.Подключены() Тогда 
		Возврат;
	КонецЕсли;
	
	#КонецОбласти
	
	#Область ОпределениеПолучателейСообщения
	
	Получатели = Новый Массив;
	
	Для Каждого СвойстваПользователя Из СвойстваПользователей Цикл 
		Получатели.Добавить(СвойстваПользователя.Ссылка);
	КонецЦикла;
	
	Если Получатели.Количество() = 0 Тогда 
		Возврат;
	КонецЕсли;
	
	#КонецОбласти
	
	#Область ГенерацияОповещенияНовыхПользователейНастроек
	
	Если ЗначениеЗаполнено(ОписаниеНастроек.Представление) Тогда 
		
		Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Предоставлены настройки отчета ""%1""'"), ОписаниеНастроек.Представление);
	Иначе
		Текст = НСтр("ru = 'Предоставлены настройки отчета'");
	КонецЕсли;
	
	Сообщение = МодульОбсуждения.ОписаниеСообщения(Текст);
	Сообщение.Данные = ОписаниеНастроек;
	Сообщение.Действия.Добавить(
		ВариантыОтчетовКлиентСервер.ИмяДействияПрименитьПереданныеНастройки(),
		НСтр("ru = 'Применить настройки?'"));
		
	Попытка
		МодульОбсуждения.ОтправитьСообщение(
			Пользователи.ТекущийПользователь(),
			Получатели,
			Сообщение,
			ОписаниеНастроек.ВариантОтчета);
	Исключение
		
		КодОсновногоЯзыка = ОбщегоНазначения.КодОсновногоЯзыка();
		ПредставлениеВариантаОтчета = Строка(ОписаниеНастроек.ВариантОтчета);
		
		ЗаписьЖурналаРегистрации(
			НСтр("ru = 'Варианты отчетов.Оповещение о предоставлении доступа к настройкам отчета'", КодОсновногоЯзыка),
			УровеньЖурналаРегистрации.Ошибка,,
			ПредставлениеВариантаОтчета,
			ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
		
	КонецПопытки;
	
	#КонецОбласти
	
КонецПроцедуры

#КонецОбласти

////////////////////////////////////////////////////////////////////////////////
// Конструкторы.

#Область Конструкторы

// Конструктор коллекции предопределенных вариантов отчетов.
//
// Возвращаемое значение:
//   см. ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов.Настройки.
//
Функция КоллекцияПредопределенныхВариантовОтчетов()
	
	РеквизитыСправочника = Метаданные.Справочники.ВариантыОтчетов.Реквизиты;
	
	ОписаниеПризнака = Новый ОписаниеТипов("Булево");
	ОписаниеМассива = Новый ОписаниеТипов("Массив");
	ОписаниеСоответствия = Новый ОписаниеТипов("Соответствие");
	ОписаниеСтруктуры = Новый ОписаниеТипов("Структура");
	ОписаниеОбъектаМетаданных = Новый ОписаниеТипов("ОбъектМетаданных");
	ОписаниеВариантаОтчета = Новый ОписаниеТипов(
		"СправочникСсылка.ПредопределенныеВариантыОтчетов, 
		|СправочникСсылка.ПредопределенныеВариантыОтчетовРасширений");
	
	Результат = Новый ТаблицаЗначений;
	
	Результат.Колонки.Добавить("Отчет", РеквизитыСправочника.Отчет.Тип);
	Результат.Колонки.Добавить("Метаданные", ОписаниеОбъектаМетаданных);
	Результат.Колонки.Добавить("ИспользуетСКД", ОписаниеПризнака);
	Результат.Колонки.Добавить("КлючВарианта", РеквизитыСправочника.КлючВарианта.Тип);
	Результат.Колонки.Добавить("ОписаниеПолучено", ОписаниеПризнака);
	Результат.Колонки.Добавить("Включен", ОписаниеПризнака);
	Результат.Колонки.Добавить("ВидимостьПоУмолчанию", ОписаниеПризнака);
	Результат.Колонки.Добавить("ПоказыватьВПодменюВариантов", ОписаниеПризнака);
	Результат.Колонки.Добавить("Наименование", ОписаниеТиповСтрока());
	Результат.Колонки.Добавить("Описание", ОписаниеТиповСтрока());
	Результат.Колонки.Добавить("Размещение", ОписаниеСоответствия);
	Результат.Колонки.Добавить("НастройкиДляПоиска", ОписаниеСтруктуры);
	Результат.Колонки.Добавить("СистемнаяИнформация", ОписаниеСтруктуры);
	Результат.Колонки.Добавить("Тип", ОписаниеТиповСтрока());
	Результат.Колонки.Добавить("ЭтоВариант", ОписаниеПризнака);
	Результат.Колонки.Добавить("ФункциональныеОпции", ОписаниеМассива);
	Результат.Колонки.Добавить("ГруппироватьПоОтчету", ОписаниеПризнака);
	Результат.Колонки.Добавить("КлючЗамеров", ОписаниеТиповСтрока());
	Результат.Колонки.Добавить("ОсновнойВариант", РеквизитыСправочника.КлючВарианта.Тип);
	Результат.Колонки.Добавить("ФорматНастроекСКД", ОписаниеПризнака);
	Результат.Колонки.Добавить("ОпределитьНастройкиФормы", ОписаниеПризнака);
	Результат.Колонки.Добавить("Назначение", Новый ОписаниеТипов("ПеречислениеСсылка.НазначенияВариантовОтчетов"));
	
	// Вспомогательные сведения для процедуры ОбновитьНастройкиПредопределенных.
	Результат.Колонки.Добавить("НайденВБазеДанных", ОписаниеПризнака);
	Результат.Колонки.Добавить("ВариантИзБазы"); // строка выборки из таблицы
	Результат.Колонки.Добавить("ВариантРодитель", ОписаниеВариантаОтчета);
	
	Результат.Индексы.Добавить("Отчет");
	Результат.Индексы.Добавить("Отчет, ЭтоВариант");
	Результат.Индексы.Добавить("Отчет, КлючВарианта");
	Результат.Индексы.Добавить("Отчет, КлючВарианта, ЭтоВариант");
	Результат.Индексы.Добавить("КлючВарианта");
	Результат.Индексы.Добавить("Метаданные, КлючВарианта");
	Результат.Индексы.Добавить("Метаданные, ЭтоВариант");
	
	Возврат Результат;
	
КонецФункции

// Возвращает описание указанного отчета по умолчанию.
//
// Параметры:
//  ОписанияОтчетов - см. КоллекцияПредопределенныхВариантовОтчетов
//  МетаданныеОтчета - ОбъектМетаданныхОтчет
//  СсылкаОтчета - СправочникСсылка.ИдентификаторыОбъектовМетаданных
//               - СправочникСсылка.ИдентификаторыОбъектовРасширений
//  ТипОтчета - см. ТипОтчетаСтрокой
//  ГруппироватьПоОтчетам - см. ГлобальныеНастройки
//
// Возвращаемое значение:
//   СтрокаТаблицыЗначений - см. КоллекцияПредопределенныхВариантовОтчетов
//
Функция ОписаниеОтчетаПоУмолчанию(ОписанияОтчетов, МетаданныеОтчета, СсылкаОтчета,
	ТипОтчета = Неопределено, ГруппироватьПоОтчетам = Неопределено)
	
	Если ТипОтчета = Неопределено Тогда 
		ТипОтчета = ТипОтчетаСтрокой(СсылкаОтчета);
	КонецЕсли;
	
	Если ГруппироватьПоОтчетам = Неопределено Тогда 
		ГруппироватьПоОтчетам = ГлобальныеНастройки().ВыводитьОтчетыВместоВариантов;
	КонецЕсли;
	
	ИспользуетСКД = (МетаданныеОтчета.ОсновнаяСхемаКомпоновкиДанных <> Неопределено);
	ФорматНастроекСКД = (ИспользуетСКД И МетаданныеОтчета.Реквизиты.Количество() = 0);
	НастройкиДляПоиска = Новый Структура("НаименованияПолей, НаименованияПараметровИОтборов, КлючевыеСлова, ИменаМакетов");
	
	ОписаниеОтчета = ОписанияОтчетов.Добавить();
	ОписаниеОтчета.Отчет = СсылкаОтчета;
	ОписаниеОтчета.Метаданные = МетаданныеОтчета;
	ОписаниеОтчета.Включен = Истина;
	ОписаниеОтчета.ВидимостьПоУмолчанию = Истина;
	ОписаниеОтчета.Описание = МетаданныеОтчета.Пояснение;
	ОписаниеОтчета.Наименование = МетаданныеОтчета.Представление();
	ОписаниеОтчета.ОписаниеПолучено = Истина;
	ОписаниеОтчета.Тип = ТипОтчета;
	ОписаниеОтчета.ГруппироватьПоОтчету = ГруппироватьПоОтчетам;
	ОписаниеОтчета.ИспользуетСКД = ИспользуетСКД;
	ОписаниеОтчета.ФорматНастроекСКД = ФорматНастроекСКД;
	ОписаниеОтчета.НастройкиДляПоиска = НастройкиДляПоиска;
	ОписаниеОтчета.Назначение = ВариантыОтчетовСлужебный.НазначениеВариантаОтчетаПоУмолчанию();
	
	Возврат ОписаниеОтчета;

КонецФункции

// Возвращает массив с одним элементом - описание по умолчанию указанного отчета.
//
// Параметры:
//  Отчет - ОбъектМетаданныхОтчет
//        - СправочникСсылка.ИдентификаторыОбъектовМетаданных - метаданные или ссылка отчета.
//
// Возвращаемое значение:
//   Массив из см. КоллекцияПредопределенныхВариантовОтчетов
//
Функция НайденныеОписанияОтчета(Отчет)
	
	НайденныеОписанияОтчета = Новый Массив;
	
	Если ТипЗнч(Отчет) = Тип("ОбъектМетаданных") Тогда
		
		СсылкаОтчета = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(Отчет);
		МетаданныеОтчета = Отчет;
	Иначе
		СсылкаОтчета = Отчет;
		МетаданныеОтчета = ОбщегоНазначения.ОбъектМетаданныхПоИдентификатору(Отчет);
	КонецЕсли;
	
	Если Не ОтчетПодключенКХранилищу(МетаданныеОтчета) Тогда
		Возврат НайденныеОписанияОтчета;
	КонецЕсли;
	
	ОписанияОтчетов = КоллекцияПредопределенныхВариантовОтчетов();
	ОписаниеОтчета = ОписаниеОтчетаПоУмолчанию(ОписанияОтчетов, МетаданныеОтчета, СсылкаОтчета);
	НайденныеОписанияОтчета.Добавить(ОписаниеОтчета);
	
	Возврат НайденныеОписанияОтчета;
	
КонецФункции

// Конструктор результата актуализации вариантов отчетов.
//
// Возвращаемое значение:
//   Структура - коллекция свойств результата актуализации вариантов отчетов, где:
//       * ЕстьИзменения - Булево - признак наличия изменений в вариантах отчетов.
//       * ЕстьВажныеИзменения - Булево - признак наличия важных изменений в вариантах отчетов.
//       * ПустаяСсылка - СправочникСсылка.ВариантыОтчетов - ссылка на пустой вариант отчета.
//       * ОбработанныеПредопределенные - Соответствие - индекс обработанных вариантов отчетов.
//       * ОсновныеВарианты - см. КоллекцияОсновныхВариантовОтчетов
//
Функция РезультатАктуализацииВариантовОтчетов()
	
	Результат = Новый Структура();
	
	Результат.Вставить("ЕстьИзменения", Ложь);
	Результат.Вставить("ЕстьВажныеИзменения", Ложь);
	Результат.Вставить("ПустаяСсылка", Справочники.ВариантыОтчетов.ПустаяСсылка());
	Результат.Вставить("ПоискРодителей", Новый Соответствие);
	Результат.Вставить("ОбработанныеПредопределенные", Новый Соответствие);
	Результат.Вставить("ОсновныеВарианты", КоллекцияОсновныхВариантовОтчетов());
	
	Возврат Результат;
	
КонецФункции

// Конструктор коллекции основных вариантов отчетов.
//
// Возвращаемое значение:
//   ТаблицаЗначений - коллекция основных вариантов отчетов, где:
//       * Отчет - СправочникСсылка.ИдентификаторыОбъектовРасширений
//               - СправочникСсылка.ДополнительныеОтчетыИОбработки
//               - СправочникСсылка.ИдентификаторыОбъектовМетаданных
//               - Строка - ссылка на идентификатор метаданных отчета.
//       * Вариант - СправочникСсылка.ВариантыОтчетов - ссылка на вариант отчета.
//
Функция КоллекцияОсновныхВариантовОтчетов()
	
	ОсновныеВариантыОтчетов = Новый ТаблицаЗначений();
	
	ОсновныеВариантыОтчетов.Колонки.Добавить("Отчет", Метаданные.Справочники.ВариантыОтчетов.Реквизиты.Отчет.Тип);
	ОсновныеВариантыОтчетов.Колонки.Добавить("Вариант", Новый ОписаниеТипов("СправочникСсылка.ВариантыОтчетов"));
	
	Возврат ОсновныеВариантыОтчетов;
	
КонецФункции

// Конструктор результата обновления общих данных.
//
// Параметры:
//  Режим - Строка - вид обновления данных.
//  РазделенныеОбработчики - Структура
//
// Возвращаемое значение:
//   Структура - свойства результата обновления общих данных, где:
//       * ОбновлятьКонфигурацию - Булево - признак необходимости обновления данных конфигурации.
//       * ОбновлятьРасширения - Булево - признак необходимости обновления данных расширений.
//       * РазделенныеОбработчики - Структура
//       * ЕстьИзменения - Булево - признак наличия изменений в вариантах отчетов.
//       * ЕстьВажныеИзменения - Булево - признак наличия важных изменений в вариантах отчетов.
//       * ВариантыОтчетов - ТаблицаЗначений
//       * ОбновлятьЗамеры - Булево - признак наличия подсистемы ОценкаПроизводительности.
//       * ТаблицаЗамеров - см. ТаблицаЗамеров
//       * МодельСервиса - Булево - признак работы в модели сервиса.
//
Функция РезультатОбновленияОбщихДанных(Знач Режим, Знач РазделенныеОбработчики)
	
	Результат = Новый Структура();
	
	Результат.Вставить("ОбновлятьКонфигурацию", Режим = "ОбщиеДанныеКонфигурации");
	Результат.Вставить("ОбновлятьРасширения", Режим = "ОбщиеДанныеРасширений");
	Результат.Вставить("РазделенныеОбработчики", РазделенныеОбработчики);
	Результат.Вставить("ЕстьИзменения", Ложь);
	Результат.Вставить("ЕстьВажныеИзменения", Ложь);
	Результат.Вставить("ВариантыОтчетов", ПредопределенныеВариантыОтчетов(?(Результат.ОбновлятьКонфигурацию, "Внутренний", "Расширение")));
	Результат.Вставить("ОбновлятьЗамеры", ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОценкаПроизводительности"));
	Результат.Вставить("ТаблицаЗамеров", ТаблицаЗамеров());
	Результат.Вставить("МодельСервиса", ОбщегоНазначения.РазделениеВключено());
	
	Возврат Результат;
	
КонецФункции

// Конструктор таблицы замеров.
//
// Возвращаемое значение:
//   ТаблицаЗначений:
//       * СтароеИмя - Строка - не актуальный ключ замеров.
//       * АктуальноеИмя - Строка - текущий ключ замеров.
//       * АктуальноеНаименование - Строка - текущее наименование отчета.
//
Функция ТаблицаЗамеров()
	
	Результат = Новый ТаблицаЗначений;
	
	Результат.Колонки.Добавить("СтароеИмя", ОписаниеТиповСтрока(150));
	Результат.Колонки.Добавить("АктуальноеИмя", ОписаниеТиповСтрока(150));
	Результат.Колонки.Добавить("АктуальноеНаименование", ОписаниеТиповСтрока(150));
	
	Возврат Результат;
	
КонецФункции

// Конструктор структуры, содержащей результат поиск доступных вариантов отчетов.
// 
// Возвращаемое значение:
//  Структура:
//    * ТолькоТекущийРаздел - Булево
//    * ТаблицаПодсистем - ТаблицаЗначений:
//        ** Ссылка - СправочникСсылка.ИдентификаторыОбъектовМетаданных
//                  - СправочникСсылка.ИдентификаторыОбъектовРасширений
//        ** Представление - Строка
//        ** Имя - Строка
//        ** ПолноеИмя - Строка
//        ** Приоритет - Строка
//        ** НомерЭлемента - Число
//        ** ИмяЭлемента - Строка
//        ** РодительСсылка - СправочникСсылка.ИдентификаторыОбъектовМетаданных
//                          - СправочникСсылка.ИдентификаторыОбъектовРасширений
//        ** РазделСсылка - СправочникСсылка.ИдентификаторыОбъектовМетаданных
//                        - СправочникСсылка.ИдентификаторыОбъектовРасширений
//        ** ВидимыхВариантов - Число
//    * ДругиеРазделы - Массив
//    * Варианты - ТаблицаЗначений:
//        ** Ссылка - СправочникСсылка.ВариантыОтчетов
//        ** Подсистема - СправочникСсылка.ИдентификаторыОбъектовМетаданных
//                      - СправочникСсылка.ИдентификаторыОбъектовРасширений
//        ** ПодсистемаПредставление - Строка
//        ** ПодсистемаПриоритет - Строка
//        ** РазделСсылка - СправочникСсылка.ИдентификаторыОбъектовМетаданных
//                        - СправочникСсылка.ИдентификаторыОбъектовРасширений
//        ** БезГруппы - Булево
//        ** Важный - Булево
//        ** СмТакже - Булево
//        ** Дополнительный - Булево
//        ** Видимость - Булево
//        ** БыстрыйДоступ - Булево
//        ** ИмяОтчета - Строка
//        ** Наименование - Строка
//        ** Описание - Строка
//        ** Автор - СправочникСсылка.Пользователи
//                 - СправочникСсылка.ВнешниеПользователи
//        ** Отчет - СправочникСсылка.ИдентификаторыОбъектовМетаданных
//                 - СправочникСсылка.ИдентификаторыОбъектовРасширений
//                 - СправочникСсылка.ДополнительныеОтчетыИОбработки
//                 - Строка
//        ** ТипОтчета - ПеречислениеСсылка.ТипыОтчетов
//        ** КлючВарианта - Строка
//        ** Родитель - СправочникСсылка.ВариантыОтчетов
//        ** ВерхнийУровень - Булево
//        ** КлючЗамеров - Строка
//    * ВариантыРаздела - см. ВариантыОтчетовДляВывода.Варианты
//    * ИспользоватьПодсветку - Булево
//    * РезультатПоиска - см. НайтиВариантыОтчетов
//    * МассивСлов - Массив
//    * ИмяГруппы - Строка
//    * ДобавляемыеРеквизиты - Массив из РеквизитФормы
//    * ДобавленоПустыхДекораций - Число
//    * ПределВывода - Число
//    * ОсталосьВывести - Число
//    * НеВыведено - Число
//    * ВыведеноЭлементовВариантов - Число
//    * ПоискВариантов - Соответствие
//    * Шаблоны - Структура:
//        ** ГруппаВарианта - Структура:
//             *** Вид - ВидГруппыФормы
//             *** РастягиватьПоГоризонтали - Булево
//             *** Отображение - ОтображениеОбычнойГруппы
//             *** Группировка - ГруппировкаПодчиненныхЭлементовФормы
//             *** ОтображатьЗаголовок - Булево
//        ** КартинкаБыстрогоДоступа - Структура:
//             *** Вид - ВидДекорацииФормы
//             *** Ширина - Число
//             *** Высота - Число
//             *** Картинка - Картинка
//             *** РастягиватьПоГоризонтали - Булево
//             *** РастягиватьПоВертикали - Булево
//        ** КартинкаОтступа - Структура:
//             *** Вид - ВидДекорацииФормы
//             *** Ширина - Число
//             *** Высота - Число
//             *** РастягиватьПоГоризонтали - Булево
//             *** РастягиватьПоВертикали - Булево
//        ** НадписьВарианта - Структура:
//             *** Вид - ВидДекорацииФормы
//             *** Гиперссылка - Булево
//             *** ЦветТекста - Цвет
//             *** РастягиватьПоВертикали - Булево
//             *** Высота - Число
//             *** РастягиватьПоГоризонтали - Булево
//             *** АвтоМаксимальнаяШирина - Булево
//             *** МаксимальнаяШирина - Число
//    * КонтекстноеМеню - Структура:
//        ** УбратьИзБыстрогоДоступа - Структура:
//             *** Видимость - Булево
//        ** ПереместитьВБыстрыйДоступ - Структура:
//             *** Видимость - Булево
//        ** Изменить - Структура:
//             *** Видимость - Булево
//    * ГруппыВажности - Массив из Строка
//    * БыстрыйДоступ - Структура:
//        ** Отбор - Структура:
//             *** БыстрыйДоступ - Булево
//        ** Варианты - Массив из СтрокаТаблицыЗначений
//        ** Количество - Число
//    * БезГруппы - Структура:
//        ** Отбор - Структура:
//             *** БыстрыйДоступ - Булево
//             *** БезГруппы - Булево
//        ** Варианты - Массив из СтрокаТаблицыЗначений
//        ** Количество - Число
//    * СГруппой - Структура:
//        ** Отбор - Структура:
//             *** БыстрыйДоступ - Булево
//             *** БезГруппы - Булево
//             *** СмТакже - Булево
//        ** Варианты - Массив из СтрокаТаблицыЗначений
//        ** Количество - Число
//    * СмТакже - Структура:
//        ** Отбор - Структура:
//             *** БыстрыйДоступ - Булево
//             *** БезГруппы - Булево
//             *** СмТакже - Булево
//        ** Варианты - Массив из СтрокаТаблицыЗначений
//        ** Количество - Число
//    * ВыводятсяВариантыТекущегоРаздела - Булево
//    * ВариантыКоличество - Число
//    * ПодсистемыРаздела - ТаблицаЗначений:
//        ** Ссылка - СправочникСсылка.ИдентификаторыОбъектовМетаданных
//                  - СправочникСсылка.ИдентификаторыОбъектовРасширений
//        ** Представление - Строка
//        ** Имя - Строка
//        ** ПолноеИмя - Строка
//        ** Приоритет - Строка
//        ** НомерЭлемента - Число
//        ** ИмяЭлемента - Строка
//        ** РодительСсылка - СправочникСсылка.ИдентификаторыОбъектовМетаданных
//                          - СправочникСсылка.ИдентификаторыОбъектовРасширений
//        ** РазделСсылка - СправочникСсылка.ИдентификаторыОбъектовМетаданных
//                        - СправочникСсылка.ИдентификаторыОбъектовРасширений
//        ** ВидимыхВариантов - Число
//
Функция ВариантыОтчетовДляВывода() Экспорт
	
	Результат = Новый Структура;
	Результат.Вставить("ТолькоТекущийРаздел", Ложь);
	Результат.Вставить("ТаблицаПодсистем", Неопределено);
	Результат.Вставить("ДругиеРазделы", Новый Массив);
	Результат.Вставить("Варианты", Неопределено);
	Результат.Вставить("ИспользоватьПодсветку", Ложь);
	Результат.Вставить("РезультатПоиска", Новый Структура);
	Результат.Вставить("МассивСлов", Новый Массив);
	
	Возврат Результат;
	
КонецФункции

#КонецОбласти

#КонецОбласти
